POST HTTP bằng JSON trong Java


186

Tôi muốn tạo một HTTP POST đơn giản bằng JSON trong Java.

Giả sử URL là www.site.com

và nó lấy giá trị {"name":"myname","age":"20"}được dán nhãn là 'details'ví dụ.

Làm thế nào tôi có thể tạo ra cú pháp cho POST?

Tôi dường như cũng không thể tìm thấy một phương thức POST trong JSON Javadocs.

Câu trả lời:


167

Dưới đây là những gì bạn cần làm:

  1. Nhận ApacheClClient, điều này sẽ cho phép bạn thực hiện yêu cầu cần thiết
  2. Tạo một yêu cầu HttpPost với nó và thêm tiêu đề "application / x-www-form-urlencoding"
  3. Tạo một StringEntity mà bạn sẽ truyền JSON cho nó
  4. Thực hiện cuộc gọi

Mã này trông giống như (bạn vẫn sẽ cần gỡ lỗi và làm cho nó hoạt động)

//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
Bạn có thể nhưng luôn luôn thực hành tốt để trừu tượng hóa nó thành JSONObject như thể bạn đang thực hiện trực tiếp trong chuỗi, bạn có thể lập trình chuỗi sai và gây ra lỗi cú pháp. Bằng cách sử dụng JSONObject, bạn đảm bảo rằng việc xê-ri hóa của bạn luôn tuân theo đúng cấu trúc JSON
momo

3
Trong nguyên tắc, cả hai chỉ truyền dữ liệu. Sự khác biệt duy nhất là cách bạn xử lý nó trong máy chủ. Nếu bạn chỉ có một vài cặp khóa-giá trị thì một tham số POST bình thường với key1 = value1, key2 = value2, v.v. có lẽ là đủ, nhưng một khi dữ liệu của bạn phức tạp hơn và đặc biệt là chứa cấu trúc phức tạp (đối tượng lồng nhau, mảng), bạn sẽ muốn bắt đầu xem xét sử dụng JSON. Gửi cấu trúc phức tạp bằng cặp khóa-giá trị sẽ rất khó chịu và khó phân tích trên máy chủ (bạn có thể thử và bạn sẽ thấy ngay lập tức). Vẫn còn nhớ ngày mà chúng ta phải làm điều đó .. nó không đẹp lắm ..
ơi

1
Rất vui được giúp đỡ! Nếu đây là những gì bạn đang tìm kiếm, bạn nên chấp nhận câu trả lời để những người khác có câu hỏi tương tự dẫn đến câu hỏi của họ. Bạn có thể sử dụng dấu kiểm trên câu trả lời. Hãy cho tôi biết nếu bạn có thêm câu hỏi
momo

12
Không nên loại nội dung là 'application / json'. 'application / x-www-form-urlencoding' ngụ ý chuỗi sẽ được định dạng tương tự như chuỗi truy vấn. NM Tôi thấy những gì bạn đã làm, bạn đặt json blob như một giá trị của một tài sản.
Matthew Ward

1
Phần không dùng nữa nên được thay thế bằng cách sử dụng ClosizableHttpClient cung cấp cho bạn phương thức .close () -. Xem stackoverflow.com/a/20713689/1484047
Frame91

90

Bạn có thể sử dụng thư viện Gson để chuyển đổi các lớp java thành các đối tượng JSON.

Tạo một lớp pojo cho các biến bạn muốn gửi theo ví dụ trên

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

trở thành

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

một khi bạn đặt các biến trong lớp pojo1, bạn có thể gửi nó bằng mã sau

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

và đây là hàng nhập khẩu

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;

và cho GSON

import com.google.gson.Gson;

1
xin chào, làm thế nào để bạn tạo đối tượng httpClient của bạn? Đó là một giao diện
user3290180

1
Vâng, đó là một Giao diện. Bạn có thể tạo một cá thể bằng cách sử dụng 'httpClient httpClient = new DefaultHttpClient ();'
Prakash

2
bây giờ không được dùng nữa, chúng ta phải sử dụng httpClient httpClient = HttpClientBuilder.create (). build ();
dùng3290180

5
Làm thế nào để nhập httpClientBuilder?
Esterlinkof

3
Tôi thấy nó sạch hơn một chút khi sử dụng tham số ContentType trên hàm tạo StringUtils và chuyển vào ContentType.APPLICATION_JSON thay vì đặt tiêu đề theo cách thủ công.
TownCube

47

@ câu trả lời của mẹ cho Apache httpClient, phiên bản 4.3.1 trở lên. Tôi đang sử dụng JSON-Javađể xây dựng đối tượng JSON của mình:

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

Nó có thể dễ dàng nhất để sử dụng kết nối httpURLC .

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

Bạn sẽ sử dụng JSONObject hoặc bất cứ điều gì để xây dựng JSON của bạn, nhưng không xử lý mạng; bạn cần phải tuần tự hóa nó và sau đó chuyển nó đến một kết nối httpURLC để POST.


JSONObject j = new JSONObject (); j.put ("tên", "tên tôi"); j.put ("tuổi", "20"); Như thế à? Làm thế nào để tôi tuần tự hóa nó?
asdf007

@ asdf007 chỉ cần sử dụng j.toString().
Alex Churchill

Đó là sự thật, kết nối này đang bị chặn. Đây có lẽ không phải là một vấn đề lớn nếu bạn đang gửi POST; nó quan trọng hơn nhiều nếu bạn chạy một máy chủ web.
Alex Churchill

Liên kết httpURLCconnectection đã chết.
Tobias Roland

bạn có thể gửi ví dụ làm thế nào để đăng json lên cơ thể?

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
Vui lòng xem xét chỉnh sửa bài đăng của bạn để thêm giải thích về những gì mã của bạn làm và lý do tại sao nó sẽ giải quyết vấn đề. Một câu trả lời chủ yếu chỉ chứa mã (ngay cả khi nó hoạt động) thường sẽ không giúp OP hiểu vấn đề của họ
Reeno

14

Hãy thử mã này:

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

Cảm ơn! Chỉ có câu trả lời của bạn mới giải quyết được vấn đề mã hóa :)
Shrikant

@SonuDhakar tại sao bạn gửi application/jsoncả dưới dạng tiêu đề chấp nhận và dưới dạng nội dung
Kasun Siyambalapitiya

Dường như đó DefaultHttpClientlà sự phản đối.
sdgfsdh

11

Tôi thấy câu hỏi này đang tìm giải pháp về cách gửi yêu cầu bài đăng từ máy khách java đến Google Endpoint. Các câu trả lời trên, rất có thể đúng, nhưng không hoạt động trong trường hợp Google Endpoint.

Giải pháp cho Google Endpoint.

  1. Phần thân yêu cầu chỉ chứa chuỗi JSON, không phải cặp name = value.
  2. Tiêu đề loại nội dung phải được đặt thành "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();
    }

    Nó chắc chắn có thể được thực hiện bằng cách sử dụng httpClient.


8

Bạn có thể sử dụng mã sau với Apache HTTP:

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

response = client.execute(request);

Ngoài ra, bạn có thể tạo một đối tượng json và đặt các trường vào đối tượng như thế này

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

điều quan trọng là thêm ContentType.APPLICATION_JSON nếu không nó không hoạt động với tôi StringEntity mới (payload, ContentType.APPLICATION_JSON)
Johnny Cage

2

Đối với Java 11, bạn có thể sử dụng máy khách HTTP mới :

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

Bạn có thể sử dụng nhà xuất bản từ InputStream, String, File. Chuyển đổi JSON thành Chuỗi hoặc IS bạn có thể với Jackson.


1

Java 8 với apache 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

Tôi giới thiệu http-request được xây dựng trên 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. 
}

Nếu bạn muốn gửi JSONtheo yêu cầu cơ thể, bạn có thể:

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

Tôi rất muốn đọc tài liệu trước khi sử dụng.


Tại sao bạn đề nghị điều này qua câu trả lời ở trên với hầu hết các upvote?
Jeryl Cook

Bởi vì nó rất đơn giản để sử dụng và thực hiện thao tác với phản ứng.
Beno Arakelyan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.