[java] Java 용 REST 클라이언트를 어떻게 작성합니까? [닫은]

JSR 311 및 해당 구현을 통해 REST를 통해 Java 객체를 노출하는 강력한 표준이 있습니다. 그러나 클라이언트 측에는 웹 서비스를 숨기고 데이터를 투명하게 Java 객체에 마샬링하는 SOAP for Apache Axis와 비교할 수없는 것이없는 것 같습니다.

Java RESTful 클라이언트를 어떻게 작성합니까? HTTPConnection을 사용하고 결과를 수동으로 구문 분석합니까? 또는 Jersey 또는 Apache CXR과 같은 전문 클라이언트입니까?



답변

이것은 오래된 질문 (2008)이므로 지금보다 많은 옵션이 있습니다.

업데이트 (2020 년에도 여전히 활성화 된 프로젝트) :

  • Apache HTTP 구성 요소 (4.2) Fluent 어댑터 -이 목록의 다른 여러 후보가 사용하는 JDK의 기본 대체입니다. 이전 Commons HTTP 클라이언트 3보다 우수하며 자체 REST 클라이언트를 빌드하는 데 사용하기가 더 쉽습니다. JSON 구문 분석 지원을 위해 Jackson 과 같은 것을사용해야하고 HTTP 컴포넌트 URIBuilder를 사용하여 Jersey / JAX-RS Rest 클라이언트와 유사한 자원 URI를 구성 할 수 있습니다. HTTP 구성 요소도 NIO를 지원하지만 REST의 짧은 요청 특성을 감안할 때 BIO보다 더 나은 성능을 얻지 못할 것입니다.Apache HttpComponents 5 는 HTTP / 2를 지원합니다.
  • OkHttp -http 구성 요소와 유사 목록의 다른 여러 후보가 사용하는 JDK의 기본 대체입니다. 최신 HTTP 프로토콜 (SPDY 및 HTTP2)을 지원합니다. 안드로이드에서 작동합니다. 불행히도 실제 리액터 루프 기반 비동기 옵션을 제공하지 않습니다 (위의 Ning 및 HTTP 구성 요소 참조). 그러나 최신 HTTP2 프로토콜을 사용하는 경우 이는 문제가되지 않습니다 (연결 수에 문제가 있다고 가정).
  • Ning Async-http-client -NIO 지원을 제공합니다. 이전에는 Sonatype에 의해 Async-http-client라고 했습니다 .
  • 하위 http 클라이언트 (okhttp, apache httpcomponents)를위한 Feign wrapper 일부 Jersey 및 CXF 확장과 유사한 인터페이스 스텁을 기반으로 클라이언트를 자동 작성합니다. 강력한 스프링 통합.
  • 개조 -하위 http 클라이언트 (okhttp) 용 래퍼. 일부 Jersey 및 CXF 확장과 유사한 인터페이스 스텁을 기반으로 클라이언트를 자동 작성합니다.
  • 발리 jdk http 클라이언트 용 래퍼 (Google 제공)
  • google-httpjdk http 클라이언트 용 래퍼 또는 Google의 Apache httpcomponents
  • 유니 레스트 JDK http 클라이언트 용 래퍼
  • 편한 jboss 프레임 워크의 일부인 jboss에 의해 jdk http 클라이언트를위한 JakartaEE 래퍼
  • jcabi-http아파치 httpcomponents를위한 래퍼, jcabi 컬렉션의 일부
  • 식당아파치 httpcomponents를위한 wrapper, restlet framework의 일부
  • 안심 래퍼를 쉽게 테스트 주장에

HTTP / REST 클라이언트 선택시주의 사항 프레임 워크 스택이 HTTP 클라이언트에 사용중인 항목, 스레딩 방법을 확인하고 동일한 클라이언트가 제공하는 경우 이상적으로 사용하십시오. Vert.x 또는 Play와 같은 것을 사용하는 경우 프레임 워크가 제공하는 버스 또는 리액터 루프에 참여하기 위해 백킹 클라이언트를 사용하려고 할 수 있습니다. 그렇지 않으면 흥미로운 스레딩 문제에 대비하십시오.


답변

이 스레드 에서 언급했듯이 JAX-RS를 구현하고 멋진 REST 클라이언트와 함께 제공되는 Jersey 를 사용하는 경향이 있습니다 . JAX-RS를 사용하여 RESTful 자원을 구현하면 Jersey 클라이언트가 JAXB / XML / JSON / Atom과 같은 엔티티 제공자를 재사용 할 수 있으므로 서버 측에서 동일한 오브젝트를 재사용 할 수 있습니다. 클라이언트 측 장치 테스트에서 사용하십시오.

예를 들어 여기Apache Camel 프로젝트 의 단위 테스트 사례 가 있습니다 (JAXB 객체 엔드 포인트를 사용하여) RESTful 리소스에서 XML 페이로드를 조회합니다. resource (uri) 메소드는 Jersey 클라이언트 API를 사용하는 이 기본 클래스에 정의되어 있습니다.

예 :

    clientConfig = new DefaultClientConfig();
    client = Client.create(clientConfig);

    resource = client.resource("http://localhost:8080");
    // lets get the XML as a String
    String text = resource("foo").accept("application/xml").get(String.class);        

BTW JAX-RS의 미래 버전이 Jersey의 라인을 따라 멋진 클라이언트 측 API를 추가하기를 바랍니다.


답변

표준 Java SE API를 사용할 수 있습니다.

private void updateCustomer(Customer customer) {
    try {
        URL url = new URL("http://www.example.com/customers");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setInstanceFollowRedirects(false);
        connection.setRequestMethod("PUT");
        connection.setRequestProperty("Content-Type", "application/xml");

        OutputStream os = connection.getOutputStream();
        jaxbContext.createMarshaller().marshal(customer, os);
        os.flush();

        connection.getResponseCode();
        connection.disconnect();
    } catch(Exception e) {
        throw new RuntimeException(e);
    }
} 

또는 Jersey와 같은 JAX-RS 구현에서 제공하는 REST 클라이언트 API를 사용할 수 있습니다. 이 API는 사용하기 쉽지만 클래스 경로에 추가 jar이 필요합니다.

WebResource resource = client.resource("http://www.example.com/customers");
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer.");
System.out.println(response); 

자세한 내용은 다음을 참조하십시오.


답변

REST 서비스 만 호출하고 응답을 구문 분석하려면 Rest Assured를 사용해보십시오.

// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");

// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");


답변

Restlet 도 확인할 수 있습니다 전체 클라이언트 측 기능이있는 을 , HttpURLConnection 또는 Apache HTTP Client (커넥터로 활용할 수있는)와 같은 하위 레벨 라이브러리보다 REST에 중점을 둔 REST를 지향합니다.

안부, 제롬 루벨


답변

Rapa 시도해 볼 수 있습니다. 이에 대한 귀하의 의견을 알려주십시오. 문제 나 예상 기능을 자유롭게 기록하십시오.


답변

두 가지 옵션을 더 지적하고 싶습니다.