Apache HttpClientを使用してJSONリクエストをPOSTする方法


89

私は次のようなものを持っています:

final String url = "http://example.com";

final HttpClient httpClient = new HttpClient();
final PostMethod postMethod = new PostMethod(url);
postMethod.addRequestHeader("Content-Type", "application/json");
postMethod.addParameters(new NameValuePair[]{
        new NameValuePair("name", "value)
});
httpClient.executeMethod(httpMethod);
postMethod.getResponseBodyAsStream();
postMethod.releaseConnection();

500で戻ってきます。サービスプロバイダーは、JSONを送信する必要があると言っています。Apache HttpClient 3.1以降ではどのように行われますか?


2
あなたはNameValuePairちょうどあなたがあなたのコード内の任意のJSONを送信していない、リクエストパラメータを追加します。サービスはどのJSON構造を受信することを期待していますか、送信するデータは何ですか?あなたは探しているpostMethod.setRequestEntity()StringRequestEntity、あなたのJSONが含まれています。
Philipp Reichart、

回答:


182

Apache HttpClientはJSONについて何も認識していないため、JSONを個別に作成する必要があります。そのためには、json.orgからシンプルなJSON-javaライブラリをチェックアウトすることをお勧めします。(「JSON-java」があなたに合わない場合、json.orgにはさまざまな言語で利用可能なライブラリの大きなリストがあります。)

JSONを生成したら、以下のコードのようなものを使用してPOSTできます

StringRequestEntity requestEntity = new StringRequestEntity(
    JSON_STRING,
    "application/json",
    "UTF-8");

PostMethod postMethod = new PostMethod("http://example.com/action");
postMethod.setRequestEntity(requestEntity);

int statusCode = httpClient.executeMethod(postMethod);

編集する

注-質問で求められている上記の回答は、Apache HttpClient 3.1に適用されます。ただし、最新のApacheクライアントに対する実装を探している人を支援するには:

StringEntity requestEntity = new StringEntity(
    JSON_STRING,
    ContentType.APPLICATION_JSON);

HttpPost postMethod = new HttpPost("http://example.com/action");
postMethod.setEntity(requestEntity);

HttpResponse rawResponse = httpclient.execute(postMethod);

どのようにjsonをgeturlに追加できますか?
Lou

1
にa parameterを追加できるかPOSTMethod、同時にa RequestEntityを設定できるかを常に知りたいですか?不合理に聞こえるかもしれませんが、興味があるだけです。
asgs

31
不思議に思う人のために、StringRequestEntityに置き換えられましたStringEntity
アレックス

8
HttpClientの新しいリリースでは、PostMethodはHttpPostに置き換えられました。
Aviro 2014年

1
json参照リンクが壊れている
Simon K.

15

以下のためのApacheのHttpClient 4.5またはそれ以降のバージョン:

    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost("http://targethost/login");
    String JSON_STRING="";
    HttpEntity stringEntity = new StringEntity(JSON_STRING,ContentType.APPLICATION_JSON);
    httpPost.setEntity(stringEntity);
    CloseableHttpResponse response2 = httpclient.execute(httpPost);

注意:

1コードをコンパイルするには、httpclientパッケージとhttpcoreパッケージの両方をインポートする必要があります。

2 try-catchブロックが省略されました。

参考アパッチ公式ガイド

Commons HttpClientプロジェクトは廃止され、現在は開発されていません。HttpClientおよびHttpCoreモジュールのApache HttpComponentsプロジェクトに置き換えられました


2

janosideによる優れた回答で述べたように、JSON文字列を作成してとして設定する必要がありますStringEntity

JSON文字列を作成するには、使い慣れたライブラリまたはメソッドを使用できます。ジャクソンライブラリーは1つの簡単な例です。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;

ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("name", "value"); // repeat as needed
String JSON_STRING = node.toString();
postMethod.setEntity(new StringEntity(JSON_STRING, ContentType.APPLICATION_JSON));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.