0

フォーマットがオフの場合は失礼します(ここで新しい)。私は以下のようなRESTサービスを持っています(実装の詳細は省略されています):

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

私がやりたいのは、上記のサービスから「mymap」オブジェクトを取得できるHttpClient(org.apache.commons.httpclient.HttpClientを使用して、apacheから別のhttpclientがあることを知っています)を作成することです。クライアントコードで次のようなことをしなければならないことを理解しています。

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

私は解決策を探していましたが、ここで応答を読む方法を見つけることができません。クライアントとサービスを書くのはこれが初めてなので、解決策を見つけたかもしれませんが、それを理解することはできませんでした:(どんな提案も本当に役に立ちます!!!ありがとう。

4

1 に答える 1

1

Apache HttpClientチュートリアルから:

サーバーから返されたステータスに関係なく、応答本文が常に読み取られることが重要です。これを行うには、次の 3 つの方法があります。

  • コールしmethod.getResponseBody()ます。これにより、応答本文のデータを含むバイト配列が返されます。
  • コールしmethod.getResponseBodyAsString()ます。これは、応答本文を含む文字列を返します。ただし、バイトから文字列への変換はデフォルトのエンコーディングを使用して行われるため、このメソッドはすべてのプラットフォームで移植できるわけではないことに注意してください。
  • を呼び出しmethod.getResponseBodyAsStream()てストリームの内容全体を読み取り、次に を呼び出しますstream.close()。この方法は、ファイルにバッファリングしたり、読み取り時に処理したりできるため、大量のデータを受信できる場合に最適です。常にデータ全体を読み取り、close()ストリームで呼び出すようにしてください。

これらの方法のいずれかで応答のコンテンツを取得した後、コンテンツを自由に解析して、探しているマップを取得できます... Apache HttpClient が解析用の機能をこれ以上提供するとは思いませんそれより。

Java 用の JSON ライブラリの 1 つ ( json-libを参照) を使用して、 によって返される文字列を解析method.getResponseBodyAsString()できますが、応答のサイズが大きくなるにつれて発生する可能性がある問題に注意してください。

于 2012-02-24T17:39:12.247 に答える