Bagaimana cara mengirim permintaan JSON menggunakan Apache HttpClient?

91

Saya punya sesuatu seperti berikut ini:

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

Itu terus datang kembali dengan 500. Penyedia layanan mengatakan saya perlu mengirim JSON. Bagaimana cara melakukannya dengan Apache HttpClient 3.1+?

Noel Yap
sumber
2
Anda NameValuePairbaru saja menambahkan parameter permintaan, Anda tidak mengirimkan JSON apa pun di kode Anda. Struktur JSON apa yang diharapkan layanan terima, apa data yang Anda kirim? Anda sedang mencari postMethod.setRequestEntity()dengan StringRequestEntityyang berisi JSON Anda.
Philipp Reichart

Jawaban:

188

Apache HttpClient tidak tahu apa-apa tentang JSON, jadi Anda harus membuat JSON Anda secara terpisah. Untuk melakukannya, saya sarankan untuk memeriksa pustaka JSON-java sederhana dari json.org . (Jika "JSON-java" tidak cocok untuk Anda, json.org memiliki banyak daftar pustaka yang tersedia dalam berbagai bahasa.)

Setelah Anda membuat JSON Anda, Anda dapat menggunakan sesuatu seperti kode di bawah ini untuk POST-nya

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

Edit

Catatan - Jawaban di atas, seperti yang ditanyakan dalam pertanyaan, berlaku untuk Apache HttpClient 3.1. Namun, untuk membantu siapa saja yang mencari implementasi terhadap klien Apache terbaru:

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);
janoside.dll
sumber
Bagaimana cara menambahkan json ke geturl?
Tuan Lou
1
Selalu ingin tahu apakah parameterdapat ditambahkan POSTMethoddan pada saat yang sama mengaturnya RequestEntity? Saya tahu kedengarannya tidak masuk akal, tapi hanya ingin tahu.
asgs
33
Bagi mereka yang bertanya-tanya, StringRequestEntitytelah diganti dengan StringEntity.
Alex
9
Dengan rilis HttpClient yang lebih baru, PostMethod telah digantikan oleh HttpPost.
Aviro
1
Tautan referensi json rusak
Simon K.
19

Untuk Apache HttpClient 4.5 atau versi yang lebih baru:

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

catatan:

1 untuk membuat kompilasi kode, baik httpclientpaket maupun httpcorepaket harus diimpor.

2 blok coba-tangkap telah dihilangkan.

Referensi : panduan resmi appache

proyek Commons HttpClient sekarang telah berakhir, dan tidak lagi dikembangkan. Ini telah digantikan oleh proyek Apache HttpComponents dalam modul HttpClient dan HttpCore-nya

ZhaoGang
sumber
3

Seperti yang disebutkan dalam jawaban yang sangat baik oleh janoside , Anda perlu membuat string JSON dan menyetelnya sebagai StringEntity.

Untuk membuat string JSON, Anda dapat menggunakan pustaka atau metode apa pun yang Anda sukai. Perpustakaan Jackson adalah salah satu contoh mudah:

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