如何从Java </string>中的HttpResponse对象中检索List <string>

时间:2014-04-18 09:30:08

标签: java spring spring-mvc httpresponse

我是这种编码的新手,我必须从不同的web应用程序的Spring控制器发送一个String集合,即List。所以我的问题是

  1. 我应该如何返回由List组成的Response 控制器?以下代码是否正常?以下是我的控制器 我将返回的代码List<String>

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

    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));
    
  3. 在此之后,我不知道该怎么做......

4 个答案:

答案 0 :(得分:1)

使用Java客户端使用Rest服务的最简单方法是使用Spring RestTemplate。我建议你将List<String>包装在另一个班级中并从你的控制器返回:

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

有了这个,您的客户端代码将非常简单:

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

如果您想继续将List<String>作为返回类型,那么客户端代码将如下所示:

    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();
    }

答案 1 :(得分:0)

如果您使用的是jstl,则可以通过for-each进行迭代

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

希望这会有所帮助!!

答案 2 :(得分:0)

我认为更好的方法是在您的应用程序中提供一个提供BookingXml的RESTFul Web服务。

如果您计划将现有控制器代码公开为Rest Webservice,可以按照此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

答案 3 :(得分:0)

这个解决方案怎么样?

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

MyObject可以是任何东西,甚至是String。