Java로 RESTful 호출을 할 것입니다. 그러나 전화를 거는 방법을 모르겠습니다. URLConnection 또는 기타를 사용해야합니까? 누구든지 나를 도울 수 있습니까? 감사합니다.
답변
당신은 서비스 제공 업체 (예 : 페이스 북, 트위터)에서 RESTful 서비스를 호출하는 경우, 당신은 그것을 할 수있는 맛을 원하는 :
외부 라이브러리를 사용하지 않으려면 java.net.HttpURLConnection
또는 javax.net.ssl.HttpsURLConnection
(SSL의 경우)를 사용할 수 있지만의 팩토리 유형 패턴으로 캡슐화 된 호출입니다 java.net.URLConnection
. 결과를 받으려면 connection.getInputStream()
을 반환해야합니다 InputStream
. 그런 다음 입력 스트림을 문자열로 변환하고 문자열을 대표적인 객체 (예 : XML, JSON 등)로 구문 분석해야합니다.
또는 Apache HttpClient (버전 4가 최신 버전)입니다. Java의 기본값보다 안정적이고 강력 URLConnection
하며 대부분의 HTTP 프로토콜을 지원하며 엄격 모드로 설정할 수 있습니다. 귀하의 답변은 여전히 유효하며 InputStream
위에서 언급 한대로 사용할 수 있습니다.
HttpClient에 대한 설명서 : http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
답변
업데이트 : 아래 답변을 작성한 지 거의 5 년이 지났습니다. 오늘 저는 다른 관점을 가지고 있습니다.
사람들이 REST라는 용어를 사용하는 시간의 99 %는 실제로 HTTP를 의미합니다. 이들은“자원”,“표현”,“상태 이전”,“균일 한 인터페이스”,“하이퍼 미디어”또는 Fielding에 의해 식별 된 REST 아키텍처 스타일의 다른 제약 또는 측면에 대해서는 덜 신경을 쓸 수 있습니다. 다양한 REST 프레임 워크가 제공하는 추상화는 혼란스럽고 도움이되지 않습니다.
따라서 : 2015 년에 Java를 사용하여 HTTP 요청을 보내려고합니다. 명확하고 표현 적이며 직관적이며 관용적이며 단순한 API를 원합니다. 무엇을 사용해야합니까? 더 이상 Java를 사용하지 않지만 지난 몇 년 동안 가장 유망하고 흥미로운 것으로 보이는 Java HTTP 클라이언트 라이브러리는 OkHttp 입니다. 확인 해봐.
URLConnection
또는 HTTPClient 를 사용하여 HTTP 요청을 코딩 하여 RESTful 웹 서비스와 확실히 상호 작용할 수 있습니다 .
그러나 일반적으로이 목적을 위해 특별히 설계된 더 단순하고 의미있는 API를 제공하는 라이브러리 또는 프레임 워크를 사용하는 것이 더 바람직합니다. 이를 통해 코드 작성, 읽기 및 디버깅이 쉬워지고 중복되는 노력이 줄어 듭니다. 이러한 프레임 워크는 일반적으로 콘텐츠 협상, 캐싱 및 인증과 같은 하위 수준 라이브러리에 반드시 존재하지 않거나 사용하기 어려운 일부 훌륭한 기능을 구현합니다.
가장 성숙한 옵션 중 일부는 Jersey , RESTEasy 및 Restlet 입니다.
Restlet과 Jersey에 대해 가장 잘 알고 POST
있습니다. 두 API 로 요청 하는 방법을 살펴 보겠습니다 .
저지 예
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
Client client = ClientBuilder.newClient();
WebTarget resource = client.target("http://localhost:8080/someresource");
Builder request = resource.request();
request.accept(MediaType.APPLICATION_JSON);
Response response = request.get();
if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity());
}
Restlet 예
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
ClientResource resource = new ClientResource("http://localhost:8080/someresource");
Response response = resource.post(form.getWebRepresentation());
if (response.getStatus().isSuccess()) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity().getText());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity().getText());
}
물론 GET 요청은 훨씬 간단하며 엔터티 태그 및 Accept
헤더 와 같은 항목을 지정할 수도 있지만 이러한 예제가 유용하지는 않지만 너무 복잡하지는 않기를 바랍니다.
보다시피 Restlet과 Jersey는 비슷한 클라이언트 API를 가지고 있습니다. 나는 그것들이 같은시기에 개발되어 서로에게 영향을 미쳤다고 믿는다.
Restlet API가 좀 더 의미 론적이므로 조금 더 명확하지만 YMMV입니다.
내가 말했듯이, Restlet에 가장 익숙하고 수년 동안 많은 앱에서 사용했으며 매우 기쁩니다. 매우 성숙하고 강력하며 단순하고 효과적이며 능동적이며 잘 지원되는 프레임 워크입니다. Jersey 나 RESTEasy와 대화 할 수는 없지만 둘 다 확실한 선택입니다.
답변
이것은 자바에서 매우 복잡하므로 Spring의 RestTemplate
추상화를 사용하는 것이 좋습니다 .
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
참고:
- Spring Blog : Spring 3에서 휴식 (RestTemplate)
- 스프링 레퍼런스 : 클라이언트에서 RESTful 서비스에 액세스
- JavaDoc :
RestTemplate
답변
Java에서 REST 서비스를 간단하게 호출 해야하는 경우이 라인을 따라 무언가를 사용하십시오.
/*
* Stolen from http://xml.nig.ac.jp/tutorial/rest/index.html
* and http://www.dr-chuck.com/csev-blog/2007/09/calling-rest-web-services-from-java/
*/
import java.io.*;
import java.net.*;
public class Rest {
public static void main(String[] args) throws IOException {
URL url = new URL(INSERT_HERE_YOUR_URL);
String query = INSERT_HERE_YOUR_URL_PARAMETERS;
//make connection
URLConnection urlc = url.openConnection();
//use post mode
urlc.setDoOutput(true);
urlc.setAllowUserInteraction(false);
//send query
PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.print(query);
ps.close();
//get result
BufferedReader br = new BufferedReader(new InputStreamReader(urlc
.getInputStream()));
String l = null;
while ((l=br.readLine())!=null) {
System.out.println(l);
}
br.close();
}
}
답변
몇 가지 RESTful API가 있습니다. Jersey를 추천합니다.
클라이언트 API 설명서가 여기 있습니다.
https://jersey.java.net/documentation/latest/index.html
아래 주석에서 OAuth 문서의 업데이트 위치는 사용 불능 링크이며 https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334 로 이동했습니다.
답변
Post JSON 호출로 REST WS를 호출하여 개인 경험을 공유하고 싶습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;
public class HWS {
public static void main(String[] args) throws IOException {
URL url = new URL("INSERT YOUR SERVER REQUEST");
//Insert your JSON query request
String query = "{'PARAM1': 'VALUE','PARAM2': 'VALUE','PARAM3': 'VALUE','PARAM4': 'VALUE'}";
//It change the apostrophe char to double colon char, to form a correct JSON string
query=query.replace("'", "\"");
try{
//make connection
URLConnection urlc = url.openConnection();
//It Content Type is so importan to support JSON call
urlc.setRequestProperty("Content-Type", "application/xml");
Msj("Conectando: " + url.toString());
//use post mode
urlc.setDoOutput(true);
urlc.setAllowUserInteraction(false);
//send query
PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.print(query);
Msj("Consulta: " + query);
ps.close();
//get result
BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
String l = null;
while ((l=br.readLine())!=null) {
Msj(l);
}
br.close();
} catch (Exception e){
Msj("Error ocurrido");
Msj(e.toString());
}
}
private static void Msj(String texto){
System.out.println(texto);
}
}
답변
CXF를 확인할 수 있습니다 . JAX-RS 기사를 방문 하십시오 여기에서
전화는 다음과 같이 간단합니다 (인용).
BookStore store = JAXRSClientFactory.create("http://bookstore.com", BookStore.class);
// (1) remote GET call to http://bookstore.com/bookstore
Books books = store.getAllBooks();
// (2) no remote call
BookResource subresource = store.getBookSubresource(1);
// {3} remote GET call to http://bookstore.com/bookstore/1
Book b = subresource.getDescription();