web-dev-qa-db-fra.com

Comment POST Requête JSON utilisant Apache HttpClient?

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 continue à revenir avec un 500. Le fournisseur de service dit que je dois envoyer JSON. Comment cela se fait-il avec Apache HttpClient 3.1+?

82
Noel Yap

Apache HttpClient ne sait rien du JSON, vous devrez donc construire votre JSON séparément. Pour ce faire, je vous recommande de consulter la simple bibliothèque JSON-Java de json.org . (Si "JSON-Java" ne vous convient pas, json.org contient 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 POST it

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

Modifier

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

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 pour compiler le code, les packages httpclient et httpcore doivent être importés.

2 bloc try-catch a été omis.

Référence : guide officiel 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.

7
ZhaoGang

Comme mentionné dans l'excellente réponse de janoside, vous devez construire la chaîne JSON et la définir en tant que StringEntity.

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 de 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));
1
ADTC