Apache HttpClient kullanarak JSON isteği nasıl POST yapılır?


91

Aşağıdaki gibi bir şeyim var:

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 ile geri geliyor. Servis sağlayıcı JSON göndermem gerektiğini söylüyor. Apache HttpClient 3.1+ ile bu nasıl yapılır?


2
Sizin NameValuePairsadece kodunuzda herhangi JSON göndermiyoruz, bir istek parametre ekler. Hizmet hangi JSON yapısını almayı bekliyor, verileriniz ne gönderecek? JSON'nuzu içeren postMethod.setRequestEntity()bir ile arıyorsunuz StringRequestEntity.
Philipp Reichart

Yanıtlar:


188

Apache HttpClient, JSON hakkında hiçbir şey bilmediğinden, JSON'nuzu ayrı olarak oluşturmanız gerekir. Bunu yapmak için, json.org'dan basit JSON-java kitaplığına bakmanızı öneririm . ("JSON-java" size uymuyorsa, json.org'da farklı dillerde kullanılabilen büyük bir kitaplık listesi vardır.)

JSON'nuzu oluşturduktan sonra, POST yapmak için aşağıdaki koda benzer bir şey kullanabilirsiniz.

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

Düzenle

Not - Soruda sorulduğu üzere yukarıdaki cevap Apache HttpClient 3.1 için geçerlidir. Ancak, en son Apache istemcisine karşı bir uygulama arayan herkese yardımcı olmak için:

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'ye nasıl ekleyebilirim?
Bay Lou

1
Her zaman a parametereklenip eklenemeyeceğini bilmek POSTMethodve aynı zamanda RequestEntityona bir a ayarlamak mı istediniz ? Mantıksız göründüğünü biliyorum, ama sadece ilginç.
2013

33
Merak edenler StringRequestEntityiçin yerini almıştır StringEntity.
Alex

9
HttpClient'in sonraki sürümlerinde PostMethod, HttpPost ile değiştirildi.
Aviro

1
json referans bağlantısı kesildi
Simon K.

19

İçin Apache HttpClient 4.5 veya daha yeni bir sürümü:

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

Not:

1 kodun derlenebilmesi için hem httpclientpaketin hem de paketin httpcoreiçe aktarılması gerekir.

2 try-catch bloğu çıkarıldı.

Referans : appache resmi kılavuzu

Commons HttpClient projesi artık kullanım ömrünün sonuna geldi ve artık geliştirilmiyor. HttpClient ve HttpCore modüllerinde Apache HttpComponents projesi ile değiştirildi


3

Janoside'nin mükemmel yanıtında belirtildiği gibi , JSON dizesini oluşturmanız ve bunu bir StringEntity.

JSON dizesini oluşturmak için, rahat olduğunuz herhangi bir kitaplığı veya yöntemi kullanabilirsiniz. Jackson kitaplığı kolay bir örnektir:

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));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.