web-dev-qa-db-ja.com

JavaでのRESTfulな呼び出し

私はJavaでRESTfulな呼び出しをするつもりです。しかし、電話のかけ方がわかりません。 URLConnectionなどを使用する必要がありますか?誰でも私を助けてもらえますか。ありがとうございました。

128
Questions

サービスプロバイダ(Facebook、Twitterなど)からRESTfulサービスを呼び出す場合は、任意のフレーバーで選択できます。

外部ライブラリを使用したくない場合は、Java.net.HttpURLConnectionまたはjavax.net.ssl.HttpsURLConnection(SSL用)を使用できますが、それはJava.net.URLConnectionのFa​​ctory型パターンでカプセル化された呼び出しです。結果を受け取るには、InputStreamを返すconnection.getInputStream()が必要です。その後、入力ストリームを文字列に変換し、その文字列をその代表的なオブジェクト(XML、JSONなど)に解析する必要があります。

あるいは、 Apache HttpClient (バージョン4が最新)です。これは、JavaのデフォルトのURLConnectionよりも安定していて堅牢で、(すべてではないにしても)ほとんどのHTTPプロトコルをサポートしています(および厳密モードに設定できます)。あなたの応答はまだInputStreamの中にあるでしょう、そしてあなたはそれを上で述べたように使うことができます。


HttpClientに関するドキュメント: http://hc.Apache.org/httpcomponents-client-ga/tutorial/html/index.html

80
Buhake Sindi

更新:私が以下に答えを書いてから5年近く経ちました。今日は違う見方をしています。

人々がRESTという用語を使うときの99%は、本当にHTTPを意味します。 「リソース」、「表現」、「状態転送」、「統一インターフェース」、「ハイパーメディア」、またはその他の 制約やRESTアーキテクチャスタイルの特定の側面についてはあまり気にする必要はありません。フィールディング そのため、さまざまなRESTフレームワークによって提供される抽象化は混乱を招き、役に立ちません。

だから:あなたは2015年にJavaを使用してHTTPリクエストを送信したいです。あなたは明確で表現力豊かで、直感的で、慣用的で、シンプルなAPIが欲しいのです。何を使う?私はもうJavaを使用しませんが、ここ数年、最も有望で興味深いと思われるJava HTTPクライアントライブラリは OkHttp です。見てみな。


URLConnectionまたは HTTPClient を使用してHTTPリクエストをコーディングすることで、RESTful Webサービスと確実に対話できます。

ただし、この目的のために特別に設計された、より単純でセマンティックなAPIを提供するライブラリまたはフレームワークを使用する方が一般的には望ましいです。これにより、コードの作成、読み取り、およびデバッグが容易になり、作業の重複が軽減されます。これらのフレームワークは一般に、コンテンツネゴシエーション、キャッシング、認証など、必ずしも低レベルのライブラリには存在しない、または使いやすいとは限らない優れた機能をいくつか実装しています。

最も成熟したオプションのいくつかは、 JerseyRESTEasy 、および Restlet です。

私はRestletとJerseyに精通しています。両方のAPIを使ってPOSTリクエストを行う方法を見てみましょう。

ジャージーの例

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と話すことはできませんが、両方とも確かな選択であるという印象があります。

142
Avi Flax

これはJavaでは非常に複雑なので、Springの RestTemplate 抽象化を使用することをお勧めします。

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

参照:

27

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

いくつかの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 に移動しました

10
Qwerky

私の個人的な経験を共有したいのですが、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);
    }
}
7
Lisandro

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
Joopiter

最も簡単な解決策は、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);
4
Hemin

実際、これは「Javaでは非常に複雑」です。

から: 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
JRun