Programing

Java용 REST 클라이언트를 어떻게 생성하십니까?

c10106 2022. 5. 24. 23:06
반응형

Java용 REST 클라이언트를 어떻게 생성하십니까?

JSR 311과 그 구현을 통해 우리는 REST를 통한 Java 객체 노출을 위한 강력한 표준을 가지고 있다.그러나 클라이언트 쪽에서는 SOAP용 Apache Axis에 버금가는 무언가가 빠진 것 같다. 즉, 웹 서비스를 숨기고 데이터를 Java 개체로 투명하게 다시 저장하는 것이다.

Java RESTful 클라이언트는 어떻게 생성하십니까?HTTPConnection 및 수동 결과 구문 분석 사용?또는 예를 들어, 전문화된 고객저지 아니면 아파치 CXR?

이것은 오래된 질문이다(2008) 그래서 지금은 그 당시보다 더 많은 선택지가 있다:

UPDATES(2020년 프로젝트가 여전히 활성 상태임):

  • Apache HTTP 구성 요소(4.2) 유창한 어댑터 - JDK를 위한 기본 교체, 이 목록의 다른 여러 후보가 사용.기존 Commons HTTP Client 3보다 우수하고 자체 REST 클라이언트 구축에 사용하기 쉬움.JSON 구문 분석 지원에 잭슨과 같은 것을 사용해야 하며 HTTP 구성 요소 URI를 사용하여 저지/JAX-RS Rest 클라이언트와 유사한 리소스 URI를 구성할 수 있다.HTTP 컴포넌트도 NIO를 지원하지만 REST라는 짧은 요청으로 인해 BIO보다 더 좋은 성능을 얻을 수 있을지 의문이다.Apache HttpComponents 5는 HTTP/2를 지원한다.
  • OkHttp - 이 목록의 다른 여러 후보가 사용하는 HTTP 구성 요소와 유사한 JDK의 기본 교체.새로운 HTTP 프로토콜(SPDY 및 HTTP2) 지원Android에서 작동함.불행히도 이 시스템은 진정한 원자로 루프 기반 비동기 옵션을 제공하지 않는다(위의 Ning 및 HTTP 구성 요소 참조).그러나 새로운 HTTP2 프로토콜을 사용하는 경우 이는 문제가 되지 않는다(연결 카운트가 문제라고 가정할 때).
  • NIO 지원을 제공하는 Ning Async-http-client.이전에 알려진 이름 Sonatype별 비동기-http-client .
  • 하위 수준 http 클라이언트(okhttp, apache httpcomponents)에 대해 래퍼를 가장하십시오.일부 저지 및 CXF 확장과 유사한 인터페이스 스텁을 기반으로 클라이언트 자동 생성강력한 봄철 통합.
  • Retrofit - 하위 수준 http 클라이언트용 래퍼(okhttp).일부 저지 및 CXF 확장과 유사한 인터페이스 스텁을 기반으로 클라이언트 자동 생성
  • jdk http 클라이언트용 발리 래퍼(구글 사용)
  • 구글에 의한 jdk http 클라이언트 또는 apache httpcomponents에 대한 Google 패키지
  • jdk http 클라이언트에 대한 가장 큰 래퍼, by kong
  • 레스테이시 자카르jdk http 클라이언트에 대한 EE 래퍼(jboss) by jboss 프레임워크의 일부
  • jcabi 컬렉션의 일부인 apache httpcomponents용 jcabi-cape 래퍼
  • apache httpcomponents용 restlet 래퍼, restlet 프레임워크의 일부
  • 간단한 테스트를 위해 주장과 함께 포장지를 다시 덮다.

HTTP/REST 클라이언트 선택 시 주의사항.프레임워크 스택이 HTTP 클라이언트에 대해 무엇을 사용하고 있는지, 어떻게 스레딩되는지 확인하십시오. 클라이언트가 제공될 경우 동일한 클라이언트를 이상적으로 사용하십시오.즉, 만약 당신이 Vert.x나 Play와 같은 것을 사용한다면 당신은 그 프레임워크가 제공하는 어떤 버스나 원자로 루프에 참여하기 위해 그것의 지원 클라이언트를 이용하려고 할 것이다...그렇지 않으면, 아마도 흥미로운 실타래 문제에 대비할 수 있을 것이다.

가 이 에서 언급했듯이 나는 JAX-RS를 구현하고 멋진 REST 고객과 함께 오는 저지(Jersey)를 사용하는 경향이 있다.좋은 점은 JAX-RS를 사용하여 RESTful 자원을 구현하면 JAXB/XML/JSON/Atom 등과 같은 엔티티 제공자를 JAXB/XML/JSON/Atom 등의 엔티티 제공자를 재사용할 수 있으므로 클라이언트측 단위 테스트에서 사용하는 것과 동일한 객체를 서버측에서 재사용할 수 있다는 것이다.

예를 들어, 여기 (JAXB 객체 Endpoint 사용) RESTful 리소스에서 XML 페이로드를 검색하는 Apache Camel 프로젝트유닛 테스트 사례가 있다.리소스(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를 따라 멋진 클라이언트 쪽 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); 
    } 
} 

또는 저지 같은 JAX-RS 구현에서 제공하는 REST 클라이언트 API를 사용할 수 있다.이러한 API는 사용하기 더 쉽지만, 당신의 클래스 경로에 추가 단지가 필요하다.

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

또한 전체 클라이언트 측 기능을 갖춘 REST를 HTTPURLConnection 또는 Apache HTTP Client와 같은 하위 수준 라이브러리(커넥터로서 활용할 수 있음)를 확인할 수 있다.

안녕하십니까, 제롬 루벨

라파도 먹어봐같은 것에 대한 당신의 피드백을 우리에게 알려줘.문제나 예상 기능을 기록하십시오.

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

해보다JdkRequestJcabi-http(나는 개발자야).작동 방식은 다음과 같다.

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

나는 최근에 스퀘어부터 Retrofit Library를 시도했다. It's great and you call your rest API를 아주 쉽게 부를 수 있다.주석 기반 구성을 통해 보일러 판 코딩을 제거할 수 있다.

OkHttp는 Retrofit과 결합하면 가볍고 강력하다.이것은 안드로이드뿐만 아니라 일반 자바 사용에서도 잘 작동한다.

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

Retrofit: http://square.github.io/retrofit/

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

나는 모든 HTTP 측면을 처리하기 위해 Apache HTTPClient를 사용한다.

XML을 개체 모델에 구문 분석하는 XML 컨텐츠에 대해 XML 색스 파서를 작성한다.축2는 XML -> 모델 방법(축 1은 이 부분을 성가시게 숨겼음)도 폭로한다고 본다.XML 생성기는 아주 간단하다.

내 생각에 그것은 코딩하는데 오래 걸리지 않고 꽤 효율적이다.

아무도 언급하지 않았기 때문에, 여기 또 다른 것이 있다.스프링클라우드가 사용하는 페이징.

HTTP 클라이언트를 생성하고 리우스트하는 것은 간단하지만.그러나 만약 당신이 몇몇 자동 생성 클라이언트를 사용하고 싶다면, 당신은 WADL을 사용하여 코드를 설명하고 생성할 수 있다.

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

윈터뮤트에 언급된 흥미롭고 유용한 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);
}

저지 레스트 클라이언트의 예:
종속성 추가 중:

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

위에서 목록으로 수락한 다음 Json Array로 변환하고 Json Array를 목록으로 변환하는 목록을 반환함.

Json 개체를 매개 변수로 전달하는 사후 요청의 경우:

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

나는 대부분의 시간을 RestAssessed를 사용하여 휴식 서비스 응답을 분석하고 서비스를 테스트했다.Rest Assured 외에도 Resful 서비스와 통신하기 위해 아래 라이브러리도 이용했다.

a. 저지 레스트 클라이언트

b. 봄 레스트템플릿

c. Apache HTTP 클라이언트

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

건배!

나는 현재 https://github.com/kevinsawicki/http-request을 사용하고 있다. 나는 그들의 단순함과 예시들이 보여지는 방식이 마음에 들지만, 대부분 내가 다음과 같이 읽었을 때 팔렸다.

의존성이란 무엇인가?

없어. 이 도서관의 목표는 내면의 정적인 수업이 있는 단일 클래스 클래스가 되는 거야.테스트 프로젝트는 실제 HTTP 서버 구현에 대한 요청을 테스트하기 위해 Jetty를 필요로 한다.

Java 1.6 프로젝트에서 몇 가지 문제를 해결했다.json을 객체로 해독하는 것에 대해서는, gson은 그저 무적이다 :)

참조URL: https://stackoverflow.com/questions/221442/how-do-you-create-a-rest-client-for-java

반응형