IT story

Java 용 REST 클라이언트?

hot-time 2020. 4. 21. 08:23
반응형

Java 용 REST 클라이언트?


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

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


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

2014 년경 업데이트 :

NIO 지원을 제공하는 블록의 새로운 아이 (실제로 이것이 서버와 같은 클라이언트의 성능을 실제로 향상 시키지는 않는다고 생각하지만).

업데이트 2016 :

  • OkHttp- 최신 HTTP 프로토콜 (SPDY 및 HTTP2)을 지원합니다. 안드로이드에서 작동합니다. 불행히도 실제 리액터 루프 기반 비동기 옵션을 제공하지 않습니다 (위의 Ning 및 HTTP 구성 요소 참조). 그러나 최신 HTTP2 프로토콜을 사용하는 경우 이는 문제가되지 않습니다 (연결 수에 문제가 있다고 가정).
  • 개조 -일부 Jersey 및 CXF 확장과 유사한 인터페이스 스텁을 기반으로 클라이언트를 자동으로 작성합니다. OkHttp를 사용합니다.
  • Apache HttpComponents 5는 HTTP2를 지원할 것으로 예상됩니다.

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


최근에 Retrofit Library를 정사각형으로 시도했지만 훌륭하고 나머지 API를 매우 쉽게 호출 할 수 있습니다. 주석 기반 구성을 통해 많은 보일러 플레이트 코딩을 제거 할 수 있습니다.


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


Apache HTTPClient를 사용하여 모든 HTTP 측면을 처리합니다.

XML을 개체 모델로 구문 분석하는 XML 내용에 대한 XML SAX 파서를 작성합니다. Axis2도 XML-> 모델 메소드를 노출한다고 생각합니다 (축 1 은이 부분을 성가 시게 숨겼습니다). XML 생성기는 간단합니다.

제 생각에는 코딩하는 데 시간이 오래 걸리지 않으며 매우 효율적입니다.


OkHttp는 Retrofit과 결합하여 가볍고 강력합니다. 이것은 일반적인 Java 사용뿐만 아니라 Android에서도 잘 작동합니다.

OkHttp : http://square.github.io/okhttp/

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

개조 : http://square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

jcabi-http (개발자입니다) JdkRequest에서 사용해보십시오 . 이것이 작동하는 방식입니다.

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

자세한 내용은이 블로그 게시물을 확인하십시오. http://www.yegor256.com/2014/04/11/jcabi-http-intro.html


아무도 언급하지 않았으므로 여기에 또 하나가 있습니다 : Feign . Spring Cloud에서 사용됩니다 .


잠시 동안, 나는 Resty를 사용 하고 있습니다 :

JSONResource jsonResource = new Resty().json(uri);

여기서 몇 가지 예를 찾을 수 있습니다 .


HTTP 클라이언트를 만들고 reuest를 만드는 것은 간단하지만. 그러나 자동 생성 된 일부 클라이언트를 사용하려는 경우 WADL을 사용하여 코드를 설명하고 생성 할 수 있습니다.

RestDescribe사용 하여 WSDL을 생성하고 컴파일 할 수 있으며이를 사용 하여 php, ruby, python, java 및 C #로 클라이언트를 생성 할 수 있습니다. 깨끗한 코드를 생성하고 코드 생성 후에 약간 변경 해야하는 좋은 변경 사항이 있습니다 . 여기 에서 도구 뒤에 좋은 문서와 기본 생각을 찾을 수 있습니다 .

wintermute에 언급 된 흥미롭고 유용한 WADL 도구 는 거의 없습니다.


Java 인터페이스를 원격 JSON REST 서비스에 매핑하는 라이브러리를 작성했습니다.

https://github.com/ggeorgovassilis/spring-rest-invoker

public interface BookService {
   @RequestMapping("/volumes")
   QueryResult findBooksByTitle(@RequestParam("q") String q);

   @RequestMapping("/volumes/{id}")
   Item findBookById(@PathVariable("id") String id);
}

http-rest-client를보십시오

https://github.com/g00dnatur3/http-rest-client

다음은 간단한 예입니다.

RestClient client = RestClient.builder().build();
String geocoderUrl = "http://maps.googleapis.com/maps/api/geocode/json"
Map<String, String> params = Maps.newHashMap();
params.put("address", "beverly hills 90210");
params.put("sensor", "false");
JsonNode node = client.get(geocoderUrl, params, JsonNode.class);

라이브러리는 json 직렬화 및 바인딩을 처리합니다.

여기 또 다른 예가 있습니다.

RestClient client = RestClient.builder().build();
String url = ...
Person person = ...
Header header = client.create(url, person);
if (header != null) System.out.println("Location header is:" + header.value());

마지막 예는

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams

건배!


저지 레스트 클라이언트의 예 :
의존성 추가 :

         <!-- jersey -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
   <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

    <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

ForGetMethod 및 두 개의 매개 변수 전달 :

          Client client = Client.create();
           WebResource webResource1 = client
                        .resource("http://localhost:10102/NewsTickerServices/AddGroup/"
                                + userN + "/" + groupName);

                ClientResponse response1 = webResource1.get(ClientResponse.class);
                System.out.println("responser is" + response1);

GetMethod는 하나의 매개 변수를 전달하고 목록의 응답 받기 :

       Client client = Client.create();

        WebResource webResource1 = client
                    .resource("http://localhost:10102/NewsTickerServices/GetAssignedUser/"+grpName);    
    //value changed
    String response1 = webResource1.type(MediaType.APPLICATION_JSON).get(String.class);

    List <String > Assignedlist =new ArrayList<String>();
     JSONArray jsonArr2 =new JSONArray(response1);
    for (int i =0;i<jsonArr2.length();i++){

        Assignedlist.add(jsonArr2.getString(i));    
    }

In It It List로 받아들이고 Json Array로 변환 한 다음 Json Array를 List로 변환하는 List를 반환합니다.

Post Request가 Json Object를 매개 변수로 전달하는 경우 :

   Client client = Client.create();
    WebResource webResource = client
            .resource("http://localhost:10102/NewsTickerServices/CreateJUser");
    // value added

    ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user));

    if (response.getStatus() == 500) {

        context.addMessage(null, new FacesMessage("User already exist "));
    }

참고 URL : https://stackoverflow.com/questions/221442/rest-clients-for-java

반응형