【问题标题】:How to retrieve List <String> from HttpResponse object in Java如何从 Java 中的 HttpResponse 对象中检索 List <String>
【发布时间】:2014-06-02 19:07:48
【问题描述】:

我是这种编码的新手,我必须发送一个字符串集合,即来自不同 Web 应用程序的 Spring 控制器的 List。所以我的问题是

  1. 我应该如何返回由 List 组成的响应 控制器?下面的代码工作正常吗?下面是我的控制器 我将返回 List&lt;String&gt; 的代码。

    @RequestMapping(value = "getMyBookingsXmlList", method = RequestMethod.GET)
    public @ResponseBody List<String> getMyBookingsXmlList() {
        return mbXmlImpl.getMyBookingsDetailsXmlList();
    }
    
  2. 在客户端我应该如何检索List&lt;String&gt; 哪个是从上述控制器方法发送的?下面是代码 我正在尝试这样做,但我不知道该怎么做。

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet("URL");
    HttpResponse httpResponse = httpclient.execute(httpGet);
    InputStream is = httpResponse.getEntity().getContent();
    StringBuffer buffer = new StringBuffer();
    byte [] b = new byte [1024];
    for (int n ; (n = is.read(b)) != -1 ;)
        buffer.append(new String(b, 0, n));
    

在这之后我不知道该怎么办......

【问题讨论】:

  • 是的,arraylist的返回是正确的。
  • 您从哪里发送请求?您希望在哪里得到响应?
  • 请求将来自不同 Web 应用上的不同 Java 应用程序,响应将来自另一个不同 Web 应用程序的 spring 控制器。

标签: java spring spring-mvc httpresponse


【解决方案1】:

如果您使用的是jstl,您可以通过for-each 作为迭代它

 <c:forEach items="${Name_of_RequestAttribute}" var="ite">
  <option value="${ite.Name_of_RequestAttribute}">${ite.Name_of_RequestAttribute}</option>
 </c:forEach>

希望这会有所帮助!

【讨论】:

  • 嗨,圣克里希!但是我必须从我已经发布的 java 代码中获得响应。我得到了
  • 实际上我需要从我的 java 代码中的响应中检索 List
  • 您是从控制器转发list 对吗? .您将结果转发到哪里?
  • @user2138790 所以这里的假设是来自控制器的响应是由 JSP 视图处理的,对吗?
  • 正如@TarunGupta 所说的
【解决方案2】:

我认为更好的方法是在您的应用程序中使用提供 BookingXml 的 RESTFul 网络服务。

如果您打算将现有控制器代码公开为 Rest Web 服务,您可以按照 example 中的说明使用 RestTemplate 进行 Web 服务调用。

您可以参考的其他资源: http://java.dzone.com/articles/how-use-spring-resttemplate-0 http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch18s03.html

具体来说,在您的情况下,您可以使用以下代码示例:

控制器:

@Controller
@RequestMapping("/help")
public class HelpController {

    @SuppressWarnings("unused")
    private static final Logger logger = LoggerFactory.getLogger(HelpController.class);

    @RequestMapping("/method")
    public @ResponseBody String[] greeting() {
        return new String[] { "Hello", "world" };
    }
}

客户代码:

public class Client {

    public static void main(final String[] args) {
        final RestTemplate restTemplate = new RestTemplate();
        try {

            final String[] data = restTemplate.getForObject("http://localhost:8080/appname/help/method",
                    String[].class);
            System.out.println(Arrays.toString(data));
        }
        catch (final Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

如果需要身份验证,在使用 RestTemplate 时有两种方法可以传递用户凭据:

  1. 使用此示例创建您的 RestTemplate 对象:

    HttpClient client = new HttpClient();
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("your_user","your_password");
    client.getState().setCredentials(new AuthScope("thehost", 9090, AuthScope.ANY_REALM), credentials);
    CommonsClientHttpRequestFactory commons = new CommonsClientHttpRequestFactory(client);
    RestTemplate template = new RestTemplate(commons);
    
  2. 或者同样可以使用此答案中提到的 Spring 配置来完成: https://stackoverflow.com/a/9067922/1898397

【讨论】:

  • "在您的 java 客户端中,您可以设置内容标题 'application/json"。你能从编码的角度解释一下吗?我知道这很烦人,但事实就是这样。
  • 在将请求从普通 java 客户端发送到 Web 服务时设置内容标头。 Here 是一个示例。 Here 是一个如何使用 Spring 框架使用(编写客户端代码)Web 服务的示例,希望对您有所帮助。
  • 嗨 Hirein,在我发布的示例中返回 List 也应该可以正常工作。
  • 我按照上面的代码。但这里的问题是我需要发送用户名、密码和请求,因为我们在服务器代码中有拦截器。我该怎么做。
【解决方案3】:

使用 java 客户端使用 Rest 服务的最简单解决方案是使用 Spring RestTemplate。我建议您将 List&lt;String&gt; 包装在另一个类中并从您的控制器返回:

public class BookingList  {
    private List<String> booking;
    // getters and setters
}

这样您的客户端代码将非常简单:

BookingList bookingList = restTemplate.getForObject("http://yoururl", BookingList.class, Collections.emptyMap() ) ;

如果您想继续保持List&lt;String&gt; 作为返回类型,那么客户端代码将如下所示:

    ResponseEntity<List<String>> bookingListEntity = restTemplate.exchange("http://yoururl", HttpMethod.GET, null, new ParameterizedTypeReference<List<String>>() {}, Collections.emptyMap() ) ;
    if (bookingListEntity.getStatusCode() == HttpStatus.OK) {
        List<String> bookingList = bookingListEntity.getBody();
    }

【讨论】:

    【解决方案4】:

    这个解决方案怎么样?

    ...
    ResponseEntity<MyObject[]> response = 
    restTemplate.getForEntity(uribuilder.build().encode().toUri(), 
    MyObject[].class);
    return Arrays.asList(response.getBody());
    

    MyObject 可以是任何东西,甚至是字符串。

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 2015-08-24
      • 2020-07-01
      • 2021-12-24
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多