2012-02-24 94 views
0

请原谅我的格式是否关闭(新在这里)。 我有一个像下面REST服务(实现细节省略):如何使用apache commons httpclient和getmethod来读取modelandview json响应?

import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    import org.springframework.web.bind.annotation.RequestMethod; 
    import org.springframework.web.bind.annotation.RequestParam; 
    import org.springframework.web.servlet.ModelAndView; 
    import org.springframework.web.servlet.view.json.MappingJacksonJsonView; 

    @Controller 
    @RequestMapping(value={"/myservice", "/myservice/"}, method=RequestMethod.POST) 
    public class MyClass{ 

    @RequestMapping(value={"/",""}, method=RequestMethod.GET) 
    public ModelAndView doSomething(@RequestParam(value="params", required=true) String params){ 

    Map<String,Object> mymap = new HashMap<String,Object>(); 
    mymap.put("myparam",params); 

    return new ModelAndView(new MappingJacksonJsonView(), mymap); 
    } 
    } 

我想要做的是写一个HttpClient的(使用org.apache.commons.httpclient.HttpClient,我知道有另一HttpClient的Apache的在那里),可以从上述服务获取“mymap”对象。我知道我必须做类似下面在我的客户端代码:

public Map<String,String> getMap(){ 

HttpClient client = new HttpClient(); 
HttpMethod method = new GetMethod("myurl"); 
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
            new DefaultHttpMethodRetryHandler(3, false)); 

NameValuePair [] pair = { new NameValuePair("content","mytestcontentvalue")}; 
((GetMethod)method).setQueryString(pair); 

int code = client.executeMethod(method); 

Map<String,String> mymap = ?? /// what do i do here? 

return mymap; 
} 

我一直在寻找一个解决方案,但我不能找到一种方法,在这里阅读响应。这是我第一次写一个客户端和服务等都可能是我发现了一个解决方案,但永远无法理解它:( 任何建议,真正帮助!谢谢

回答

0

从Apache的HttpClient的tutorial

至关重要的是,响应体总是不管读取服务器返回的状态有三种方法可以做到这一点:

  • 呼叫method.getResponseBody()这将在响应主体返回一个包含数据的字节数组
  • 致电method.getResponseBodyAsString()。这将返回一个包含响应主体的字符串。不过要注意的是,从字节到字符串的转换是使用默认编码完成的,因此此方法可能无法在所有平台间移植。
  • 致电method.getResponseBodyAsStream()并读取该流的全部内容,然后致电stream.close()。如果可以接收大量数据,这种方法是最好的,因为它可以缓冲到文件或读取时处理。请务必阅读整个数据并在流上致电close()

你已经检索到的响应的内容,在这些方式中的一个之后,你就可以自由解析的内容,让你正在寻找...我不相信,阿帕奇的HttpClient地图为您提供了更多用于解析的功能。

您可以使用Java的JSON库之一(请参阅:json-lib)解析method.getResponseBodyAsString()返回的字符串,但要注意随着响应大小的增加可能出现的问题。

+0

感谢您的反馈意见。我相信你可以同时使用getResponseBody和getResponseBodyAsStream()。 – chapstick 2012-02-24 19:13:09

相关问题