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+?

Noel Yap
la source
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);
janoside
la source
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

ZhaoGang
la source
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));
ADTC
la source