JavaでのRESTful呼び出し


150

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


これは、アプリケーションでREST呼び出しを行う方法によって異なります。JaxRS実装を使用していますか?特定のもの?リクエストを手動で行っていますか?
Colin Hebert

@Colin Hebert、返信ありがとうございます。しかし、RESTfulな呼び出しについての考えはありません。RESTful呼び出しのさまざまな部分について詳しく教えてください。
質問は

チェックアウトhttp RESTfulクライアントここをクリック
Gaurav J

回答:


91

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

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

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


HttpClientのドキュメント:http : //hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html


5
車輪を作り直すのではなく、既存のRESTful実装の1つを使用してください。
Qwerky

13
ホイールを再発明することではなく、好きなように使用できると言っていますflavour。いくつかのデフォルトを使用しURLConnection、一部は望んでいますHttpClient。いずれにせよ、それはあなたが使用するためにそこにあります。
Buhake Sindi

@エリート紳士、返信ありがとうございます。すべてのライブラリを確認した後、Apache HttpClientを使用したいのですが、これについてもっと詳しく教えてもらえますか?
質問

@ Questions、HttpClient 4の例へのリンクが壊れているように見えるので、質問があれば(意図的に...笑いました)、私に知らせてください....ほぼ毎日対応しています。
Buhake Sindi、

これらのクラスの存在を単に示すのではなく、使用方法のコード例を示してください
Jonathan

150

更新:以下の回答を書いてからほぼ5年になります。今日、私は別の見方をしています。

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

したがって、2015年にJavaを使用してHTTPリクエストを送信する必要があります。明確で表現力豊かで直感的で、慣用的でシンプルなAPIが必要です。何を使う?私はJavaをもう使用していませんが、過去数年間、最も有望で興味深いJava HTTPクライアントライブラリはOkHttpです。見てみな。


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

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

最も成熟したオプションには、JerseyRESTEasyRestletがあります。

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

レストレットの例

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に最も慣れています。私は何年にもわたって多くのアプリでそれを使用しており、とても満足しています。それは非常に成熟した、堅牢、シンプル、効果的、アクティブ、そして十分にサポートされたフレームワークです。ジャージーとかRESTEasyとは話せませんが、どちらもしっかりした選択だと思います。


2
しかし、それでも素晴らしい記事です。そして私は、「人々がRESTという用語を使用する99%の時間は、実際にはHTTPを意味します。...したがって、さまざまなRESTフレームワークによって提供される抽象化は、混乱し、役に立たない」と同意する必要があります。
AlexD 2017年

2
あなたのジャージーの例では、フォームオブジェクトはどこで/どのように使用されますか?作成されましたが、例に何も追加されていないようです。
splungebob


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

私が言ったように:地獄のように複雑。(いいえ、私はこれに反対票を投じませんでした、それは完全に有効な解決策です)
ショーン・パトリック・フロイド

4
@Qwerkyクライアント側のAPIライブラリは通常、REST制約違反です。彼らはあまりにも多くのカップリングを紹介します。長期的には、優れたHTTPライブラリを使用する方がはるかに優れたオプションです。
Darrel Miller

10

周りにはいくつかのRESTful APIがあります。私はジャージーをお勧めします。

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メソッドリソースを呼び出すようなものです。
ブハケシンディ

@Qwerky-ジャージーを推奨する理由を回答に含めると役立つと思います。
Danny

7

REST WSをPost JSON呼び出しで呼び出して、私の個人的な経験を共有したいと思います。

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

実際、これは「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

最も簡単な解決策は、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をインスタンス化できません)。
Java Main
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.