[java] 자바에서의 RESTful 호출

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


답변

이것은 자바에서 매우 복잡하므로 Spring의 RestTemplate추상화를 사용하는 것이 좋습니다 .

String result =
restTemplate.getForObject(
    "http://example.com/hotels/{hotel}/bookings/{booking}",
    String.class,"42", "21"
);

참고:


답변

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를 추천합니다.

https://jersey.java.net/

클라이언트 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();