Comment POSTER une requête JSON à l'aide d'Apache HttpClient?


89

J'ai quelque chose comme ce qui suit:

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

Il revient sans cesse avec un 500. Le fournisseur de services dit que je dois envoyer JSON. Comment cela se fait-il avec Apache HttpClient 3.1+?


2
Vous NameValuePairajoutez simplement un paramètre de requête, vous n'envoyez aucun JSON dans votre code. Quelle structure JSON le service s'attend-il à recevoir, quelles sont vos données à envoyer? Vous recherchez postMethod.setRequestEntity()avec un StringRequestEntityqui contient votre JSON.
— Philipp Reichart

Réponses:


182

Apache HttpClient ne sait rien de JSON, vous devrez donc construire votre JSON séparément. Pour ce faire, je vous recommande de consulter la bibliothèque JSON-java simple de json.org . (Si "JSON-java" ne vous convient pas, json.org a une grande liste de bibliothèques disponibles dans différentes langues.)

Une fois que vous avez généré votre JSON, vous pouvez utiliser quelque chose comme le code ci-dessous pour le POSTER

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

Éditer

Remarque - La réponse ci-dessus, comme demandé dans la question, s'applique à Apache HttpClient 3.1. Cependant, pour aider tous ceux qui recherchent une implémentation contre le dernier client 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);

Comment ajouter le json au geturl?
— Mr Lou

1
Vous avez toujours voulu savoir si un parameterpeut être ajouté POSTMethodet en même temps RequestEntitylui attribuer un? Je sais que cela semble illogique, mais juste curieux.
— asgs

31
Pour ceux qui se demandent, StringRequestEntitya été remplacé par StringEntity.
— Alex le

8
Avec les versions ultérieures de HttpClient, PostMethod avait été remplacé par HttpPost.
— Aviro

1
Le lien de référence json est cassé
— Simon K.

15

Pour Apache HttpClient 4.5 ou une version plus récente:

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

Remarque:

1 afin de rendre le code compilé, le httpclientpackage et le httpcorepackage doivent être importés.

2 bloc try-catch a été omis.

Référence : guide officiel d'Appache

le projet Commons HttpClient est maintenant en fin de vie et n'est plus en cours de développement. Il a été remplacé par le projet Apache HttpComponents dans ses modules HttpClient et HttpCore


2

Comme mentionné dans l'excellente réponse de janoside , vous devez construire la chaîne JSON et la définir comme un fichierStringEntity .

Pour construire la chaîne JSON, vous pouvez utiliser n'importe quelle bibliothèque ou méthode avec laquelle vous êtes à l'aise. La bibliothèque Jackson est un exemple simple:

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));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.