103

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

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を送信する必要があると言っています。これはApacheHttpClient3.1+でどのように行われますか?

4

4 に答える 4

202

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

編集

注-上記の回答は、質問で求められているように、ApacheHttpClient3.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);
于 2012-08-21T17:36:17.593 に答える
28

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ブロックが省略されています。

参考appache公式ガイド

Commons HttpClientプロジェクトは現在終了しており、開発されていません。HttpClientモジュールとHttpCoreモジュールでApacheHttpComponentsプロジェクトに置き換えられました

于 2018-10-25T01:39:49.153 に答える
10

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));
于 2018-03-20T01:02:33.137 に答える
1

JACKSONライブラリを使用してオブジェクトをJSONに変換し、リクエストの本文を次のように設定します。これが完全な例です。

try (CloseableHttpClient httpclient = HttpClients.createDefault()) {

    HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");

    Post post = new Post("foo", "bar", 1);
    ObjectWriter ow = new ObjectMapper().writer();
    String strJson = ow.writeValueAsString(post);
    System.out.println(strJson);

    StringEntity strEntity = new StringEntity(strJson, ContentType.APPLICATION_JSON);
    httpPost.setEntity(strEntity);
    httpPost.setHeader("Content-type", "application/json");

    try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
        System.out.println(response.getCode() + " " + response.getReasonPhrase());

        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println(result);

        EntityUtils.consume(entity);
    } catch (ParseException e) {
        e.printStackTrace();
    }

} catch (IOException e) {
    System.out.println(e.getMessage());
}
于 2022-01-29T02:33:36.780 に答える