JavaでJSONを使用するHTTP POST


188

JavaでJSONを使用して簡単なHTTP POSTを作成したいと思います。

URLが www.site.com

そして、それは例えば{"name":"myname","age":"20"}ラベルが付けられた値を取ります'details'

POSTの構文を作成するにはどうすればよいですか?

また、JSON JavadocsにPOSTメソッドが見つからないようです。

回答:


167

これはあなたがする必要があることです:

  1. Apache HttpClientを取得します。これにより、必要なリクエストを行うことができます
  2. それを使用してHttpPostリクエストを作成し、ヘッダー「application / x-www-form-urlencoded」を追加します
  3. JSONを渡すStringEntityを作成します
  4. 呼び出しを実行する

コードは大体次のようになります(まだデバッグして動作させる必要があります)

//Deprecated
//HttpClient httpClient = new DefaultHttpClient(); 

HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead 

try {

    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/x-www-form-urlencoded");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    //handle response here...

}catch (Exception ex) {

    //handle exception here

} finally {
    //Deprecated
    //httpClient.getConnectionManager().shutdown(); 
}

9
ただし、文字列で直接実行しているように、文字列を誤ってプログラムして構文エラーを引き起こす可能性があるため、JSONObjectとして抽象化することは常に良い習慣です。JSONObjectを使用することで、シリアライゼーションが常に正しいJSON構造に従うようにします
momo

3
原則として、どちらもデータを送信しているだけです。唯一の違いは、サーバーでの処理方法です。キーと値のペアが少ない場合は、key1 = value1、key2 = value2などの通常のPOSTパラメータでおそらく十分ですが、データがより複雑になり、特に複雑な構造(ネストされたオブジェクト、配列)を含むようになると、 JSONの使用を検討してください。キーと値のペアを使用して複雑な構造を送信するのは非常に厄介で、サーバーで解析するのが困難です(試してみるとすぐにわかります)。私たちがそれをやらなければならなかった日をまだ覚えています..それはきれいではなかった..
momo

1
助けてくれてうれしい!これがあなたが探しているものである場合、あなたは答えを受け入れる必要があります。そうすれば、同様の質問を持つ他の人々が彼らの質問にうまく導くことができます。回答のチェックマークを使用できます。さらに質問がある場合はお知らせください
momo '25

12
content-typeを「application / json」にしないでください。'application / x-www-form-urlencoded'は、文字列がクエリ文字列と同様にフォーマットされることを意味します。NM私はあなたが何をしたかを見ます、あなたはプロパティの値としてjson blobを置きました。
マシューワード

1
非推奨の部分は、.close()メソッドを提供するCloseableHttpClientを使用して置き換える必要があります。stackoverflow.com/a/20713689/1484047を
Frame91

92

Gsonライブラリを使用して、JavaクラスをJSONオブジェクトに変換できます。

上記のように送信したい変数のpojoクラスを作成します。

{"name":"myname","age":"20"}

なる

class pojo1
{
   String name;
   String age;
   //generate setter and getters
}

pojo1クラスで変数を設定したら、次のコードを使用してそれを送信できます

String       postUrl       = "www.site.com";// put in your url
Gson         gson          = new Gson();
HttpClient   httpClient    = HttpClientBuilder.create().build();
HttpPost     post          = new HttpPost(postUrl);
StringEntity postingString = new StringEntity(gson.toJson(pojo1));//gson.tojson() converts your pojo to json
post.setEntity(postingString);
post.setHeader("Content-type", "application/json");
HttpResponse  response = httpClient.execute(post);

そしてこれらは輸入品です

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;

そしてGSONのために

import com.google.gson.Gson;

1
こんにちは、httpClientオブジェクトをどのように作成しますか?これはインターフェースです
user3290180

1
はい、それはインターフェースです。'HttpClient httpClient = new DefaultHttpClient();'を使用してインスタンスを作成できます。
Prakash

2
現在は非推奨となっているため、HttpClient httpClient = HttpClientBuilder.create()。build();を使用する必要があります。
user3290180

5
HttpClientBuilderをインポートする方法
Esterlinkof 2016

3
StringUtilsコンストラクターでContentTypeパラメーターを使用し、ヘッダーを手動で設定する代わりにContentType.APPLICATION_JSONを渡す方が少しわかりやすいと思います。
TownCube 2018

47

Apache HttpClient、バージョン4.3.1以降に対する@momoの回答。私はJSON-JavaJSONオブジェクトを構築するために使用しています:

JSONObject json = new JSONObject();
json.put("someKey", "someValue");    

CloseableHttpClient httpClient = HttpClientBuilder.create().build();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params = new StringEntity(json.toString());
    request.addHeader("content-type", "application/json");
    request.setEntity(params);
    httpClient.execute(request);
// handle response here...
} catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.close();
}

20

おそらくHttpURLConnectionを使用するのが最も簡単です。

http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139

JSONObjectなどを使用してJSONを構築しますが、ネットワークの処理には使用しません。それをシリアル化し、HttpURLConnectionに渡してPOSTする必要があります。


JSONObject j =新しいJSONObject(); j.put( "name"、 "myname"); j.put( "年齢"、 "20"); あれ?どうすればシリアル化できますか?
asdf007

@ asdf007だけを使用してくださいj.toString()
アレックスチャーチル

そうです、この接続はブロックしています。POSTを送信する場合、これはおそらく大した問題ではありません。Webサーバーを実行している場合は、さらに重要です。
アレックスチャーチル

HttpURLConnectionリンクが停止しています。
Tobias Roland

jsonを本文に投稿する方法の例を投稿できますか?

15
protected void sendJson(final String play, final String prop) {
     Thread t = new Thread() {
     public void run() {
        Looper.prepare(); //For Preparing Message Pool for the childThread
        HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 1000); //Timeout Limit
        HttpResponse response;
        JSONObject json = new JSONObject();

            try {
                HttpPost post = new HttpPost("http://192.168.0.44:80");
                json.put("play", play);
                json.put("Properties", prop);
                StringEntity se = new StringEntity(json.toString());
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);
                response = client.execute(post);

                /*Checking response */
                if (response != null) {
                    InputStream in = response.getEntity().getContent(); //Get the data in the entity
                }

            } catch (Exception e) {
                e.printStackTrace();
                showMessage("Error", "Cannot Estabilish Connection");
            }

            Looper.loop(); //Loop in the message queue
        }
    };
    t.start();
}

7
投稿を編集して、コードの機能と問題を解決する理由を詳しく説明してください。ほとんどの場合、コードが含まれているだけの回答(たとえそれが機能していても)は、通常、OPが問題を理解するのに役立ちません
Reeno

14

このコードを試してください:

HttpClient httpClient = new DefaultHttpClient();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/json");
    request.addHeader("Accept","application/json");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    // handle response here...
}catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.getConnectionManager().shutdown();
}

ありがとう!あなたの答えだけがエンコードの問題を解決しました:)
Shrikant

@SonuDhakarがAccept application/jsonヘッダーとContent-Typeの両方として送信する理由
Kasun Siyambalapitiya

DefaultHttpClient廃止予定のようです。
sdgfsdh 2017

11

JavaクライアントからGoogleエンドポイントに投稿リクエストを送信する方法についての解決策を探しているこの質問を見つけました。上記の回答、おそらく正しいが、Googleエンドポイントの場合は機能しません。

Googleエンドポイントのソリューション。

  1. リクエストの本文には、名前と値のペアではなく、JSON文字列のみを含める必要があります。
  2. コンテンツタイプヘッダーは「application / json」に設定する必要があります。

    post("http://localhost:8888/_ah/api/langapi/v1/createLanguage",
                       "{\"language\":\"russian\", \"description\":\"dsfsdfsdfsdfsd\"}");
    
    
    
    public static void post(String url, String json ) throws Exception{
      String charset = "UTF-8"; 
      URLConnection connection = new URL(url).openConnection();
      connection.setDoOutput(true); // Triggers POST.
      connection.setRequestProperty("Accept-Charset", charset);
      connection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
    
      try (OutputStream output = connection.getOutputStream()) {
        output.write(json.getBytes(charset));
      }
    
      InputStream response = connection.getInputStream();
    }

    それは確かにHttpClientを使用しても行うことができます。


8

Apache HTTPで次のコードを使用できます。

String payload = "{\"name\": \"myname\", \"age\": \"20\"}";
post.setEntity(new StringEntity(payload, ContentType.APPLICATION_JSON));

response = client.execute(request);

さらに、jsonオブジェクトを作成し、このようにフィールドをオブジェクトに入れることができます

HttpPost post = new HttpPost(URL);
JSONObject payload = new JSONObject();
payload.put("name", "myName");
payload.put("age", "20");
post.setEntity(new StringEntity(payload.toString(), ContentType.APPLICATION_JSON));

重要なのは、ContentType.APPLICATION_JSONを追加することです。それ以外の場合は機能しませんでした。新しいStringEntity(payload、ContentType.APPLICATION_JSON)
Johnny Cage

2

Java 11の場合、新しいHTTPクライアントを使用できます

 HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://localhost/api"))
        .header("Content-Type", "application/json")
        .POST(ofInputStream(() -> getClass().getResourceAsStream(
            "/some-data.json")))
        .build();

    client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();

InputStream、String、Fileのパブリッシャーを使用できます。JSONを文字列またはISに変換するには、Jacksonを使用します。


1

Apache httpClient 4を使用したJava 8

CloseableHttpClient client = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost("www.site.com");


String json = "details={\"name\":\"myname\",\"age\":\"20\"} ";

        try {
            StringEntity entity = new StringEntity(json);
            httpPost.setEntity(entity);

            // set your POST request headers to accept json contents
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");

            try {
                // your closeablehttp response
                CloseableHttpResponse response = client.execute(httpPost);

                // print your status code from the response
                System.out.println(response.getStatusLine().getStatusCode());

                // take the response body as a json formatted string 
                String responseJSON = EntityUtils.toString(response.getEntity());

                // convert/parse the json formatted string to a json object
                JSONObject jobj = new JSONObject(responseJSON);

                //print your response body that formatted into json
                System.out.println(jobj);

            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {

                e.printStackTrace();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

0

私は、apache http api上に構築されたhttp-requestをお勧めします

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost(yourUri, String.class)
    .responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   ResponseHandler<String> responseHandler = httpRequest.execute("details", yourJsonData);

   int statusCode = responseHandler.getStatusCode();
   String responseContent = responseHandler.orElse(null); // returns Content from response. If content isn't present returns null. 
}

JSONリクエスト本文として送信する場合は、次のことができます。

  ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);

使用する前に、よく読んだドキュメントをお勧めします。


なぜあなたは上記の答えよりも最も多くの賛成票でこれを提案するのですか?
ジェリルクック

それは、使用して応答による操作を行うのが非常に簡単だからです。
Beno Arakelyan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.