Java'da JSON kullanan HTTP POST


188

Java JSON kullanarak basit bir HTTP POST yapmak istiyorum.

Diyelim ki URL www.site.com

ve örneğin {"name":"myname","age":"20"}etiketli değeri alır 'details'.

POST için sözdizimini nasıl oluşturabilirim?

Ayrıca JSON Javadocs bir POST yöntemi bulmak gibi görünmüyor.

Yanıtlar:


167

Yapman gerekenler işte burada:

  1. Apache HttpClient'i edinin, bu da gerekli talebi yapmanızı sağlar
  2. Onunla bir HttpPost isteği oluşturun ve "application / x-www-form-urlencoded" başlığını ekleyin
  3. JSON'u ona geçireceğiniz bir StringEntity oluşturun
  4. Aramayı gerçekleştirin

Kod kabaca benziyor (yine de hata ayıklamanız ve çalışması gerekir)

//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
Yapabilirsiniz ama JSONObject olarak doğrudan dizede yaptığınız gibi soyutlamak iyi bir uygulamadır, dizeyi yanlış programlayabilir ve sözdizimi hatasına neden olabilirsiniz. JSONObject kullanarak, serileştirmenizin her zaman doğru JSON yapısını takip ettiğinden emin olun
momo

3
Prensip olarak, her ikisi de sadece veri iletiyor. Tek fark sunucuda nasıl işlediğinizdir. Yalnızca birkaç anahtar / değer çiftiniz varsa, key1 = değer1, anahtar2 = değer2, vb. İçeren normal bir POST parametresi muhtemelen yeterlidir, ancak verileriniz daha karmaşık ve özellikle karmaşık yapı (iç içe nesne, diziler) içeriyorsa JSON kullanmayı düşünün. Bir anahtar / değer çifti kullanarak karmaşık yapı göndermek çok kötü ve sunucuda ayrıştırmak zor olurdu (deneyebilir ve hemen görürsünüz). Hala urgh yapmak zorunda kaldığımız günü hatırlıyorum .. güzel değildi ..
momo

1
Yardımcı olduğuma sevindim! Aradığınız şey buysa, cevabı kabul etmelisiniz, böylece benzer soruları olan diğer insanlar sorularına iyi bir şekilde yönelebilirler. Cevaptaki onay işaretini kullanabilirsiniz. Başka sorularınız varsa bize bildirin
momo

12
İçerik türü 'application / json' olmamalıdır. 'application / x-www-form-urlencoded', dizenin bir sorgu dizesine benzer şekilde biçimlendirileceğini belirtir. NM: Ne yaptığınızı görüyorum, json blob'u bir mülkün değeri olarak koyuyorsunuz.
Matthew Ward

1
Kullanımdan kaldırılan bölüm, size .close () - yöntemi veren CloseableHttpClient kullanılarak değiştirilmelidir. Bkz. Stackoverflow.com/a/20713689/1484047
Frame91

92

Java sınıflarınızı JSON nesnelerine dönüştürmek için Gson kitaplığını kullanabilirsiniz.

Yukarıdaki gibi göndermek istediğiniz değişkenler için bir pojo sınıfı oluşturun Örnek

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

olur

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

pojo1 sınıfındaki değişkenleri ayarladıktan sonra aşağıdaki kodu kullanarak gönderebilirsiniz

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

ve bunlar ithalat

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;

ve GSON için

import com.google.gson.Gson;

1
merhaba, httpClient nesnenizi nasıl oluşturuyorsunuz? Bir arayüz
user3290180

1
Evet, bu bir arayüz. 'HttpClient httpClient = new DefaultHttpClient ();' kullanarak bir örnek oluşturabilirsiniz.
Prakash

2
şimdi kullanımdan kaldırıldı, HttpClient kullanmalıyız httpClient = HttpClientBuilder.create (). build ();
user3290180

5
HttpClientBuilder nasıl içe aktarılır?
Esterlinkof

3
StringUtils yapıcısında ContentType parametresini kullanmak ve üstbilgiyi el ile ayarlamak yerine ContentType.APPLICATION_JSON içinde geçmek biraz daha temiz buluyorum.
TownCube

48

@ momo'nun Apache HttpClient, sürüm 4.3.1 veya üstü için cevabı. JSON-JavaJSON nesnemi oluşturmak için kullanıyorum :

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 kullanmak muhtemelen en kolay yöntemdir .

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

JSON'unuzu oluşturmak için JSONObject veya başka bir yöntem kullanırsınız, ancak ağı işlemek için kullanmazsınız; seri hale getirmeniz ve ardından bir HttpURLConnection'a POST'a geçirmeniz gerekir.


JSONObject j = yeni JSONObject (); j.put ("ad", "adim"); j.put ("yaş", "20"); Bunun gibi? Nasıl serileştiririm?
asdf007

@ asdf007 sadece kullanın j.toString().
Alex Churchill

Bu doğru, bu bağlantı engelleniyor. Bir POST gönderiyorsanız, bu muhtemelen büyük bir sorun değildir; bir web sunucusu çalıştırıyorsanız çok daha önemlidir.
Alex Churchill

HttpURLConnection bağlantısı öldü.
Tobias Roland

nasıl json vücut göndermek için örnek gönderebilir miyim?

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
Kodunuzun ne yaptığı ve sorunun neden çözüleceği hakkında daha fazla açıklama eklemek için lütfen yayınınızı düzenleyin. Çoğunlukla sadece kod içeren bir yanıt (çalışıyor olsa bile) genellikle OP'nin sorunlarını anlamalarına yardımcı olmaz
Reeno

14

Bu kodu deneyin:

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

Teşekkürler! Sadece cevabınız kodlama sorununu çözdü :)
Shrikant

@SonuDhakar neden application/jsonhem bir kabul başlığı hem de içerik türü olarak
gönderiyorsunuz

Anlaşılmadığı anlaşılıyor DefaultHttpClient.
sdgfsdh

11

Java istemcisinden Google Endpoints'e nasıl posta isteği gönderileceği konusunda çözüm arayan bu soruyu buldum. Yukarıdaki yanıtlar, büyük olasılıkla doğrudur, ancak Google Uç Noktaları durumunda çalışmaz.

Google Uç Noktaları için çözüm.

  1. İstek gövdesi name = value pair değil, yalnızca JSON dizesini içermelidir.
  2. İçerik türü üstbilgisi "application / json" olarak ayarlanmalıdır.

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

    Elbette HttpClient kullanılarak da yapılabilir.


8

Apache HTTP ile aşağıdaki kodu kullanabilirsiniz:

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

response = client.execute(request);

Ayrıca, bir json nesnesi oluşturabilir ve bu gibi nesnelerin içine alanlar koyabilirsiniz

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

anahtar şey ContentType.APPLICATION_JSON eklemek aksi takdirde benim için yeni StringEntity (payload, ContentType.APPLICATION_JSON) işe yaramadı
Johnny Cage

2

Java 11 için yeni HTTP istemcisi kullanabilirsiniz :

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

Yayıncıyı InputStream, String, File'dan kullanabilirsiniz. JSON'u String veya IS'ye dönüştürerek Jackson ile yapabilirsiniz.


1

Apache ile Java 8 httpClient 4

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

Ben tavsiye apache http api üzerine inşa http-istek .

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İstek gövdesi olarak göndermek istiyorsanız şunları yapabilirsiniz:

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

Ben kullanmadan önce okuma belgeleri şiddetle tavsiye ederim.


neden en çok oy veren yukarıdaki cevaba göre bunu öneriyorsunuz?
Jeryl Cook

Çünkü tepki ile kullanımı ve manipülasyonu çok basittir.
Beno Arakelyan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.