Làm cách nào để ĐĂNG yêu cầu JSON bằng Apache HttpClient?


91

Tôi có một cái gì đó như sau:

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

Nó tiếp tục quay trở lại với 500. Nhà cung cấp dịch vụ nói rằng tôi cần gửi JSON. Điều đó được thực hiện như thế nào với Apache HttpClient 3.1+?


2
Bạn NameValuePairchỉ thêm một tham số yêu cầu, bạn sẽ không gửi bất kỳ JSON nào trong mã của mình. Dịch vụ mong đợi nhận được cấu trúc JSON nào, dữ liệu của bạn sẽ gửi là gì? Bạn đang tìm kiếm postMethod.setRequestEntity()với một StringRequestEntitycó chứa JSON của bạn.
Philipp Reichart

Câu trả lời:


187

Apache HttpClient không biết gì về JSON, vì vậy bạn sẽ cần phải xây dựng JSON của mình một cách riêng biệt. Để làm như vậy, tôi khuyên bạn nên xem thư viện JSON-java đơn giản từ json.org . (Nếu "JSON-java" không phù hợp với bạn, json.org có một danh sách lớn các thư viện có sẵn bằng các ngôn ngữ khác nhau.)

Khi bạn đã tạo JSON của mình, bạn có thể sử dụng một cái gì đó giống như mã bên dưới để ĐĂNG nó

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

Biên tập

Lưu ý - Câu trả lời ở trên, như được yêu cầu trong câu hỏi, áp dụng cho Apache HttpClient 3.1. Tuy nhiên, để giúp bất kỳ ai đang tìm cách triển khai ứng dụng Apache mới nhất:

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

Làm cách nào để nối json vào geturl?
Mr Lou

1
Luôn muốn biết liệu parametercó thể thêm vào POSTMethodvà đồng thời đặt a RequestEntityvào nó không? Tôi biết nó nghe có vẻ phi logic, nhưng chỉ là tò mò.
asgs

33
Đối với những người tự hỏi, StringRequestEntityđã được thay thế bằng StringEntity.
Alex

9
Với các bản phát hành sau của HttpClient, PostMethod đã được thay thế bằng HttpPost.
Aviro

1
link tham khảo json được chia
Simon K.

19

Đối với Apache HttpClient 4.5 hoặc phiên bản mới hơn:

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

Ghi chú:

1 để biên dịch mã, cả httpclientgói và httpcoregói phải được nhập.

2 khối try-catch đã được bỏ qua.

Tham khảo : hướng dẫn chính thức của appache

dự án Commons HttpClient hiện đã hết thời hạn sử dụng và không còn được phát triển. Nó đã được thay thế bởi dự án Apache HttpComponents trong các mô-đun HttpClient và HttpCore của nó


3

Như đã đề cập trong câu trả lời xuất sắc của janoside , bạn cần phải xây dựng chuỗi JSON và đặt nó là a StringEntity.

Để xây dựng chuỗi JSON, bạn có thể sử dụng bất kỳ thư viện hoặc phương pháp nào mà bạn cảm thấy thoải mái. Thư viện Jackson là một ví dụ dễ hiểu:

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