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+?
NameValuePair
baru 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 mencaripostMethod.setRequestEntity()
denganStringRequestEntity
yang berisi JSON Anda.Jawaban:
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);
sumber
parameter
dapat ditambahkanPOSTMethod
dan pada saat yang sama mengaturnyaRequestEntity
? Saya tahu kedengarannya tidak masuk akal, tapi hanya ingin tahu.StringRequestEntity
telah diganti denganStringEntity
.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
httpclient
paket maupunhttpcore
paket harus diimpor.2 blok coba-tangkap telah dihilangkan.
Referensi : panduan resmi appache
sumber
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));
sumber