Java용 REST 클라이언트를 어떻게 생성하십니까?
JSR 311과 그 구현을 통해 우리는 REST를 통한 Java 객체 노출을 위한 강력한 표준을 가지고 있다.그러나 클라이언트 쪽에서는 SOAP용 Apache Axis에 버금가는 무언가가 빠진 것 같다. 즉, 웹 서비스를 숨기고 데이터를 Java 개체로 투명하게 다시 저장하는 것이다.
Java RESTful 클라이언트는 어떻게 생성하십니까?HTTPConnection 및 수동 결과 구문 분석 사용?또는 예를 들어, 전문화된 고객저지 아니면 아파치 CXR?
이것은 오래된 질문이다(2008) 그래서 지금은 그 당시보다 더 많은 선택지가 있다:
- Apache CXF에는 세 가지 REST Client 옵션이 있음
- 저지(상기 참조)
- Spring RestTemplate이 Spring WebClient에 의해 대체됨
- Commons HTTP Client는 이전 Java 프로젝트를 위해 사용자 자신의 프로젝트를 구축한다.
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와 같은 하위 수준 라이브러리(커넥터로서 활용할 수 있음)를 확인할 수 있다.
안녕하십니까, 제롬 루벨
라파도 먹어봐같은 것에 대한 당신의 피드백을 우리에게 알려줘.문제나 예상 기능을 기록하십시오.
두 가지 옵션을 더 지적하고 싶다.
- Restfulie는 VRaptor 웹 프레임워크를 기반으로 서버 및 클라이언트 측 구현을 모두 매우 우수한 하이퍼미디어 지원을 가지고 있다.
- RESTEASY에는 JAX-RS 프록시 기반 클라이언트 구현이 있다.
해보다JdkRequest
Jcabi-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. 저지 레스트 클라이언트
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
'Programing' 카테고리의 다른 글
Java에서 c 함수 호출 (0) | 2022.05.24 |
---|---|
포인터 유효성 테스트(C/C++) (0) | 2022.05.24 |
다른 구성 요소의 Vue 호출 방식 (0) | 2022.05.24 |
다중 선택 및 v-모델(개체 어레이 포함) (0) | 2022.05.24 |
VueDevtools에서 VueJS 구성 요소를 클릭할 때까지 렌더링되지 않음 (0) | 2022.05.24 |