Apache HttpClient를 사용하여 JSON 요청을 게시하는 방법은 무엇입니까?


91

다음과 같은 것이 있습니다.

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()A를 StringRequestEntity하여 JSON을 포함하는.
Philipp Reichart 2012-08-21

답변:


187

Apache HttpClient는 JSON에 대해 전혀 알지 못하므로 JSON을 별도로 구성해야합니다. 이를 위해 json.org 에서 간단한 JSON-java 라이브러리를 확인하는 것이 좋습니다 . ( "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
a parameter를 추가 POSTMethod하고 동시에 설정할 수 있는지 항상 알고 싶 RequestEntity습니까? 비논리적으로 들리지만 호기심이 많다는 것을 알고 있습니다.
asgs

33
궁금한 사람들 StringRequestEntity을 위해는 StringEntity.
알렉스

9
HttpClient의 이후 릴리스에서는 PostMethod가 HttpPost로 대체되었습니다.
Aviro 2014 년

1
JSON 참조 링크가 깨진
사이먼 K.을

19

들어 아파치 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패키지를 모두 가져와야합니다.

2 try-catch 블록이 생략되었습니다.

참고 : appache 공식 가이드

Commons HttpClient 프로젝트는 이제 수명이 종료되었으며 더 이상 개발되지 않습니다. HttpClient 및 HttpCore 모듈에서 Apache HttpComponents 프로젝트로 대체되었습니다.


3

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.