자바에서의 RESTful 호출


150

Java로 RESTful 호출을 할 것입니다. 그러나 전화를 거는 방법을 모르겠습니다. URLConnection 또는 기타를 사용해야합니까? 누구든지 나를 도울 수 있습니까? 감사합니다.


애플리케이션에서 휴면 통화를 수행하는 방법에 따라 다릅니다. JaxRS 구현을 사용하십니까? 특별한가요? 수동으로 요청하고 있습니까?
Colin Hebert

@Colin Hebert, 답장을 보내 주셔서 감사합니다. 그러나 나는 RESTful 전화에 대한 아이디어가 없습니다. RESTful 통화의 다른 부분에 대한 자세한 정보를 제공해 주시겠습니까?
질문

Checkout http restful client 여기를 클릭하십시오
Gaurav J

답변:


91

당신은 서비스 제공 업체 (예 : 페이스 북, 트위터)에서 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
바퀴를 재발 명하지 말고 기존 RESTful 구현 중 하나를 사용하십시오.
Qwerky

13
바퀴를 재발 명하지 않고 flavour원하는 대로 사용할 수 있다고 말하고 있습니다 . 일부는 기본값을 URLConnection원하고 일부는 원합니다 HttpClient. 어느 쪽이든, 당신이 사용할 수 있습니다.
Buhake Sindi

@ 엘리트 신사 여러분의 답장을 보내 주셔서 감사합니다. 모든 라이브러리를 확인한 후 Apache HttpClient를 사용하고 싶습니다.이 라이브러리에 대해 더 많은 참조를 해 주시겠습니까?
질문

@Questions, HttpClient 4 예제에 대한 링크가 끊어진 것 같습니다. 궁금한 점이 있다면 (pun 의도 한 ... lol) 알려주세요 .... 거의 매일 처리합니다.
Buhake Sindi

이러한 클래스의 존재를
Jonathan

150

업데이트 : 아래 답변을 작성한 지 거의 5 년이 지났습니다. 오늘 저는 다른 관점을 가지고 있습니다.

사람들이 REST라는 용어를 사용하는 시간의 99 %는 실제로 HTTP를 의미합니다. 이들은“자원”,“표현”,“상태 이전”,“균일 한 인터페이스”,“하이퍼 미디어”또는 Fielding에 의해 식별 된 REST 아키텍처 스타일의 다른 제약 또는 측면에 대해서는 덜 신경을 쓸 수 있습니다. 다양한 REST 프레임 워크가 제공하는 추상화는 혼란스럽고 도움이되지 않습니다.

따라서 : 2015 년에 Java를 사용하여 HTTP 요청을 보내려고합니다. 명확하고 표현 적이며 직관적이며 관용적이며 단순한 API를 원합니다. 무엇을 사용해야합니까? 더 이상 Java를 사용하지 않지만 지난 몇 년 동안 가장 유망하고 흥미로운 것으로 보이는 Java HTTP 클라이언트 라이브러리는 OkHttp 입니다. 확인 해봐.


URLConnection또는 HTTPClient 를 사용하여 HTTP 요청을 코딩 하여 RESTful 웹 서비스와 확실히 상호 작용할 수 있습니다 .

그러나 일반적으로이 목적을 위해 특별히 설계된 더 단순하고 의미있는 API를 제공하는 라이브러리 또는 프레임 워크를 사용하는 것이 더 바람직합니다. 이를 통해 코드 작성, 읽기 및 디버깅이 쉬워지고 중복되는 노력이 줄어 듭니다. 이러한 프레임 워크는 일반적으로 콘텐츠 협상, 캐싱 및 인증과 같은 하위 수준 라이브러리에 반드시 존재하지 않거나 사용하기 어려운 일부 훌륭한 기능을 구현합니다.

가장 성숙한 옵션 중 일부는 Jersey , RESTEasyRestlet 입니다.

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와 대화 할 수는 없지만 둘 다 확실한 선택입니다.


2
그러나 여전히 좋은 소식입니다. "사람들이 REST라는 용어를 사용하는 시간의 99 %는 실제로 HTTP를 의미합니다. ... 다양한 REST 프레임 워크가 제공하는 추상화는 혼란스럽고 도움이되지 않습니다."
AlexD

2
Jersey 예제에서 Form 객체는 어디서 / 어떻게 사용됩니까? 생성되었지만 예제에 아무것도 추가하지 않는 것 같습니다.
splungebob 2016 년


24

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

1
정말 좋은 REST API가 있습니다. 바퀴를 재발 명하기보다는 하나를 사용하는 것이 좋습니다.
Qwerky

내가 말했듯이 : 지옥처럼 복잡합니다. (아니, 나는 이것을 다운 보트하지 않았다, 그것은 완벽하게 유효한 해결책이다)
Sean Patrick Floyd

4
@Qwerky 클라이언트 측 API 라이브러리는 일반적으로 REST 제약 조건을 위반합니다. 그들은 너무 많은 커플 링을 소개합니다. 좋은 HTTP 라이브러리를 사용하는 것이 장기적으로 훨씬 좋은 옵션입니다.
Darrel Miller

10

몇 가지 RESTful API가 있습니다. Jersey를 추천합니다.

https://jersey.java.net/

클라이언트 API 설명서가 여기 있습니다.

https://jersey.java.net/documentation/latest/index.html


아래 주석에서 OAuth 문서의 업데이트 위치는 사용 불능 링크이며 https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334 로 이동했습니다.


6
OP는 RESTful 애플리케이션을 작성하지 않고 RESTful 호출을 작성합니다 (예 : Twitter API 메소드 자원 호출).
Buhake Sindi

@ Qwerky-답에 Jersey를 추천 한 이유를 포함시키는 것이 도움이 될 것입니다.
Danny Bullis

7

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

5

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

5

실제로 이것은 "자바에서는 매우 복잡하다":

보낸 사람 : https://jersey.java.net/documentation/latest/client.html

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://foo").path("bar");
Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_PLAIN_TYPE);
Response response = invocationBuilder.get();

4

가장 쉬운 솔루션은 Apache http 클라이언트 라이브러리를 사용하는 것입니다. 다음 샘플 코드를 참조하십시오.이 코드는 인증을 위해 기본 보안을 사용합니다.

다음 종속성을 추가하십시오.

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
Credentials credentials = new UsernamePasswordCredentials("username", "password");
credentialsProvider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();
HttpPost request = new HttpPost("https://api.plivo.com/v1/Account/MAYNJ3OT/Message/");HttpResponse response = client.execute(request);
    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    String line = "";
    while ((line = rd.readLine()) != null) {    
    textView = textView + line;
    }
    System.out.println(textView);


-1

다음과 같이 Async Http Client (라이브러리는 WebSocket 프로토콜 도 지원 )를 사용할 수 있습니다.

    String clientChannel = UriBuilder.fromPath("http://localhost:8080/api/{id}").build(id).toString();

    try (AsyncHttpClient asyncHttpClient = new AsyncHttpClient())
    {
        BoundRequestBuilder postRequest = asyncHttpClient.preparePost(clientChannel);
        postRequest.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
        postRequest.setBody(message.toString()); // returns JSON
        postRequest.execute().get();
    }

작동하지 않습니다 (ASyncHttpClient를 표시 할 수 없음).
자바 메인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.