web-dev-qa-db-ja.com

HTTP POST JavaでJSONを使用する

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

URLがwww.site.comだとしましょう

たとえば、{"name":"myname","age":"20"}というラベルの付いた値'details'を取ります。

POSTの構文をどのように作成しますか?

JSON JavadocにPOSTメソッドが見つからないようです。

166
asdf007

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

  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(); 
}
152
momo

JavaクラスをJSONオブジェクトに変換するためにGsonライブラリを利用することができます。

上記のように送信したい変数のための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;
84
Prakash

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

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

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

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

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

20
Alex Churchill
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();
}
13
Medo

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

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();
}
12
Sonu Dhakar

私は、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 param ) 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(param.getBytes(charset));
      }
    
      InputStream response = connection.getInputStream();
    }
    

    確かにHttpClientを使っても可能です。

8
yurin

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

http-request はApache http api上に構築されています。

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

使用前に資料を読むことを強くお勧めします。

0
Beno Arakelyan

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をStringまたはISに変換するには、Jacksonを使用します。

0
user3359592