วิธีการโพสต์คำขอ JSON โดยใช้ Apache HttpClient


92

ฉันมีสิ่งต่อไปนี้:

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

มันกลับมาเรื่อย ๆ พร้อมกับ 500 ผู้ให้บริการบอกว่าฉันต้องส่ง JSON วิธีทำกับ Apache HttpClient 3.1+


2
คุณNameValuePairเพิ่งเพิ่มพารามิเตอร์คำขอคุณไม่ได้ส่ง JSON ใด ๆ ในโค้ดของคุณ โครงสร้าง JSON ใดที่บริการคาดว่าจะได้รับข้อมูลของคุณที่จะส่งคืออะไร คุณกำลังมองหาpostMethod.setRequestEntity()ที่มีStringRequestEntityที่มี JSON ของคุณ
Philipp Reichart

คำตอบ:


189

Apache HttpClient ไม่รู้อะไรเกี่ยวกับ JSON ดังนั้นคุณจะต้องสร้าง JSON ของคุณแยกกัน ต้องการทำเช่นนั้นผมขอแนะนำให้ตรวจสอบจากง่ายJSON-Javaห้องสมุดจากjson.org (หาก "JSON-java" ไม่เหมาะกับคุณ json.org มีรายการไลบรารีจำนวนมากที่มีให้บริการในภาษาต่างๆ)

เมื่อคุณสร้าง JSON แล้วคุณสามารถใช้โค้ดด้านล่างเพื่อโพสต์ได้

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

แก้ไข

หมายเหตุ - คำตอบข้างต้นตามที่ถามในคำถามใช้กับ Apache HttpClient 3.1 อย่างไรก็ตามเพื่อช่วยทุกคนที่กำลังมองหาการใช้งานกับไคลเอนต์ Apache ล่าสุด:

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

จะต่อท้าย json เข้ากับ geturl ได้อย่างไร?
Mr Lou

1
อยากทราบว่าparameterสามารถเพิ่มPOSTMethodและในเวลาเดียวกันตั้งค่า a RequestEntityได้หรือไม่? ฉันรู้ว่ามันฟังดูไร้เหตุผล แต่ก็แค่อยากรู้
asgs

33
สำหรับผู้ที่สงสัยว่าได้ถูกแทนที่ด้วยStringRequestEntity StringEntity
Alex

9
ด้วย HttpClient รุ่นต่อมา PostMethod ถูกแทนที่ด้วย HttpPost
Aviro

1
ลิงก์อ้างอิง json เสีย
Simon K.

20

สำหรับApache HttpClient 4.5หรือใหม่กว่า:

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

บันทึก:

1 ในการคอมไพล์โค้ดควรนำเข้าทั้งhttpclientแพ็คเกจและhttpcoreแพ็คเกจ

มีการระบุบล็อก try-catch 2 รายการ

ข้อมูลอ้างอิง : คู่มืออย่างเป็นทางการของ appache

โครงการ Commons HttpClient สิ้นสุดอายุการใช้งานแล้วและไม่มีการพัฒนาอีกต่อไป มันถูกแทนที่ด้วยโครงการ Apache HttpComponents ในโมดูล HttpClient และ HttpCore


4

ดังที่ได้กล่าวไว้ในคำตอบที่ยอดเยี่ยมของjanosideคุณต้องสร้างสตริง JSON และตั้งเป็นไฟล์StringEntity.

ในการสร้างสตริง JSON คุณสามารถใช้ไลบรารีหรือวิธีการใดก็ได้ที่คุณพอใจ ห้องสมุด Jackson เป็นตัวอย่างง่ายๆ:

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));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.