Java用のRESTクライアントをどのように作成しますか?[閉まっている]


247

JSR 311とその実装では、RESTを介してJavaオブジェクトを公開するための強力な標準があります。ただし、クライアント側には、Apache Axis for SOAPに相当する欠けているものがあるようです。Webサービスを隠し、データを透過的にJavaオブジェクトにマーシャリングします。

Java RESTfulクライアントをどのように作成しますか?HTTPConnectionと結果の手動解析を使用していますか?または、ジャージーやApache CXRなどの専用クライアントですか?


Apache IncubatorでApache Winkを見つけました。RESTサーバーとクライアントを作成するための興味深いプロジェクトになる可能性があります。
ヤーバ

2
これをチェックしてください:igorpolevoy.blogspot.com/2011/01/java-rest-with-ease.html感謝igor
ipolevoy

[休憩](code.google.com/p/resting)をご覧ください。RESTサービスを呼び出し、XML / JSON / YAML応答からオブジェクトのリストを1つのステップで作成することを約束します。
ニール

休息はPOSTリクエストに問題があります。
RyanBrady

2
(Jbossによる)resteasyを使用すると、非常に簡単な方法で実行できます。入門ガイドが必要な場合は、Java RESTクライアントを開発する方法についてブログ投稿を書きました。とにかく、Javaには何百もの選択肢があります。
Guido

回答:


204

これは古い質問です(2008)ので、今よりも多くのオプションがあります。

更新(2020年に引き続きアクティブなプロジェクト):

  • Apache HTTPコンポーネント(4.2)Fluentアダプター-JDKの基本的な置き換え。このリストの他の候補者によって使用されます。古いCommons HTTP Client 3よりも優れており、独自のRESTクライアントを構築するのに使いやすくなっています。JSON解析のサポートには Jacksonのようなものを使用する必要があり、 HTTPコンポーネントURIBuilderを使用して、Jersey / JAX-RS Restクライアントと同様のリソースURIを構築できます。HTTPコンポーネントもNIOをサポートしていますが、RESTの短いリクエスト性質を考えると、BIOよりも優れたパフォーマンスが得られるとは思いません。Apache HttpComponents 5はHTTP / 2をサポートしています。
  • OkHttp -JDKの基本的な置き換え。httpコンポーネントと同様、このリストの他のいくつかの候補で使用されます。新しいHTTPプロトコル(SPDYおよびHTTP2)をサポートします。Androidで動作します。残念ながら、本当のreactor-loopベースの非同期オプションは提供していません(上記のNingおよびHTTPコンポーネントを参照)。ただし、新しいHTTP2プロトコルを使用する場合、これはそれほど問題ではありません(接続数に問題があると想定)。
  • Ning Async-http-client -NIOサポートを提供します。以前は SonatypeによってAsync-http-clientとして知られていました。
  • 装う 低レベルのHTTPクライアントのラッパー(okhttp、apacheのhttpcomponents)。一部のジャージーおよびCXF拡張機能と同様のインターフェーススタブに基づいてクライアントを自動作成します。強力な春の統合。
  • レトロフィット -低レベルのhttpクライアント(okhttp)のラッパー。一部のジャージーおよびCXF拡張機能と同様のインターフェーススタブに基づいてクライアントを自動作成します。
  • Googleによるjdk httpクライアントの Volleyラッパー
  • googleによるjdk httpクライアント、またはapache httpcomponentsの google-httpラッパー
  • kdによる jdk httpクライアントの Unirestラッパー
  • jdk httpクライアント用の Resteasy JakartaEEラッパー、jboss、jbossフレームワークの一部
  • Apache httpcomponentsのjcabi-httpラッパー、jcabiコレクションの一部
  • Restlet apacheのhttpcomponentsのラッパー、のRestletフレームワークの一部
  • テストを容易にするためのアサート付きの安心ラッパー

HTTP / RESTクライアントの選択に関する警告。フレームワークスタックがHTTPクライアントに何を使用しているか、スレッドがどのように実行されているかを確認し、提供されている場合は理想的には同じクライアントを使用してください。つまり、Vert.xやPlayのようなものを使用している場合、フレームワークが提供するバスまたはリアクタループに参加するためにそのバッキングクライアントを使用したいと思うかもしれません。


1
残念ながらJerseyクライアントは、JDK <8で使用される場合、PATCHメソッドをサポートしません
ボッチャニアク'18

3
Unirestは非常に使いやすいですが、その静的な設計により、共有環境やサーバー環境では使用できません。
2015年

9
ユニレストのコメントに関しては、現在(2016年末)に、このプロジェクトがもはや維持されていないように見えることを付け加えたいと思います。新しいメンテナを要求する未解決の問題さえあります。
wegenmic '20年

4
Unirestを好きな人のために、私は現在活発にメンテナンス/更新されているフォークを持っています。
ジョシュ

3
答えをコミュニティーwikiに
変えれ

71

このスレッドで述べたように私はジャージーを使用する傾向があります JAX-RSを実装し、優れたRESTクライアントが付属ます。JAX-RSを使用してRESTfulリソースを実装すると、JerseyクライアントはJAXB / XML / JSON / Atomなどのエンティティプロバイダーを再利用できるため、サーバー側で同じオブジェクトを再利用できます。クライアント側の単体テストで使用します。

たとえば、次Apache Camelプロジェクトのユニットテストケースで、RESTfulリソースからJAXBオブジェクトエンドポイントを使用してXMLペイロードを検索します。resource(uri)メソッドは、JerseyクライアントAPIを使用するだけのこの基本クラスで定義されています。

例えば

    clientConfig = new DefaultClientConfig();
    client = Client.create(clientConfig);

    resource = client.resource("http://localhost:8080");
    // lets get the XML as a String
    String text = resource("foo").accept("application/xml").get(String.class);        

ところで、JAX-RSの将来のバージョンでは、ジャージーのAPIに沿って素晴らしいクライアント側APIが追加されることを願っています


サーバーがダウンしている場合に次のサーバーを試すために、ClientResourceでRESTサービスサーバーリストに言及できるメソッドはありますか?
Njax3SmmM2x2a0Zf7Hpd 2012

1
ただの更新ですが、Jamesの「BTW」コメントに対処するために、JAX-RS 2.0の新しいバージョンにはクライアント側APIがあります。infoq.com
Nick Klauer

64

標準のJava SE APIを使用できます。

private void updateCustomer(Customer customer) { 
    try { 
        URL url = new URL("http://www.example.com/customers"); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoOutput(true); 
        connection.setInstanceFollowRedirects(false); 
        connection.setRequestMethod("PUT"); 
        connection.setRequestProperty("Content-Type", "application/xml"); 

        OutputStream os = connection.getOutputStream(); 
        jaxbContext.createMarshaller().marshal(customer, os); 
        os.flush(); 

        connection.getResponseCode(); 
        connection.disconnect(); 
    } catch(Exception e) { 
        throw new RuntimeException(e); 
    } 
} 

または、JerseyなどのJAX-RS実装によって提供されるRESTクライアントAPIを使用できます。これらのAPIは使いやすいですが、クラスパスに追加のjarが必要です。

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

詳細については、以下を参照してください。


15
2018年の単純な休憩電話の13行は、やりすぎに聞こえます...
クリントイーストウッド

1
エラー処理とオプションを追加しても、それほど大きな違いはありません。SEのアプローチが長いようであれば、いつでもクラスにラップできます...:> JAX-RSライブラリの競合のデバッグを2日間行った後、SPI全体の悪夢を回避するために、コードを5行追加することで本当に問題ありません。
tekHedd

2
@ClintEastwoodこの投稿は2010年に作成されました
作成さ 0ddlyoko

12

RESTサービスを呼び出して応答を解析するだけの場合は、Rest Assuredを試すことができます

// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");

// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");

9

また、クライアント側の機能をすべて備えたRESTletをチェックすることもできます。REST指向で、HttpURLConnectionやApache HTTPクライアント(コネクタとして利用できる)などの低レベルのライブラリよりも指向的です。

よろしく、ジェロームルーベル


2
2019-10-24の時点で、提供されたリンクは「Restletプラットフォームがサポート終了になりました」を返します。
Hans Deragon、

6

あなたはラパを試すことができます。同じことについてフィードバックをお寄せください。また、問題や期待される機能を自由に記録してください。


1
Rapaは本当に素晴らしいインターフェースといくつかの依存関係を持っています。.NETの世界ではRestSharpの優れた代替品。
午後

プロジェクトは死んでいるように見える
tkruse



5

私は最近SquareからRetrofit Libraryを試してみましたが、その素晴らしさと、残りのAPIを非常に簡単に呼び出すことができます。注釈ベースの構成により、多くのボイラープレートコーディングを取り除くことができます。


4

私はApache HTTPClientを使用して、すべてのHTTP側を処理します。

XMLをオブジェクトモデルに解析するXMLコンテンツ用のXML SAXパーサーを作成します。Axis2もXML-> Modelメソッドを公開していると思います(Axis 1はこの部分をうっとうしく隠しました)。XMLジェネレーターはごく単純です。

私の意見では、コーディングに時間がかからず、非常に効率的です。


4
私の意見では、これはRESTを実行するための最悪の方法です。Javaでシリアル化を手動で処理するのは、JAXBやJacksonのように多くのオプションがある場合、時間の無駄です。ドキュメント全体をロードしてXPathを使用する場合でも、SAXよりもわずかに遅く、XML(ネットワーク速度)を取得する場合に比べて何も起こりません。
アダムゲント

1
私も同意し、元のコメントを書きました。当時、私は逆シリアル化の制御を望んでいましたが、今日では、ジャクソンと適切に注釈が付けられたモデルクラスを使用していました。
JeeBee 2013年

4

OkHttpは、レトロフィットと組み合わせると軽量で強力です。これは、Androidだけでなく、一般的なJavaの使用にも適しています。

OkHttphttp : //square.github.io/okhttp/

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

後付けhttp : //square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}


2

HTTPクライアントを作成して再要求するのは簡単ですが。しかし、自動生成されたクライアントを利用したい場合は、WADLを利用してコードを記述および生成できます。

RestDescribeを使用してWSDLを生成およびコンパイルできます。これを使用して、php、ruby、python、java、およびC#でクライアントを生成できます。それはきれいなコードを生成し、コード生成後に少しそれを微調整しなければならないという良い変更があります、あなたはここでツールの背後にある良いドキュメントと根底にある考えを見つけることができます。。

wintermuteで言及されている興味深い便利なWADLツールはほとんどありません。



0

http-rest-clientを見てみてください

https://github.com/g00dnatur3/http-rest-client

以下に簡単な例を示します。

RestClient client = RestClient.builder().build();
String geocoderUrl = "http://maps.googleapis.com/maps/api/geocode/json"
Map<String, String> params = Maps.newHashMap();
params.put("address", "beverly hills 90210");
params.put("sensor", "false");
JsonNode node = client.get(geocoderUrl, params, JsonNode.class);

ライブラリはjsonのシリアル化とバインディングを処理します。

ここに別の例があります

RestClient client = RestClient.builder().build();
String url = ...
Person person = ...
Header header = client.create(url, person);
if (header != null) System.out.println("Location header is:" + header.value());

そして最後の例として、

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams

乾杯!


0

ジャージーレストクライアントの例:
依存関係の追加:

         <!-- jersey -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
   <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

    <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

ForGetMethodと2つのパラメーターを渡す:

          Client client = Client.create();
           WebResource webResource1 = client
                        .resource("http://localhost:10102/NewsTickerServices/AddGroup/"
                                + userN + "/" + groupName);

                ClientResponse response1 = webResource1.get(ClientResponse.class);
                System.out.println("responser is" + response1);

1つのパラメーターを渡して、リストの応答を取得するGetMethod:

       Client client = Client.create();

        WebResource webResource1 = client
                    .resource("http://localhost:10102/NewsTickerServices/GetAssignedUser/"+grpName);    
    //value changed
    String response1 = webResource1.type(MediaType.APPLICATION_JSON).get(String.class);

    List <String > Assignedlist =new ArrayList<String>();
     JSONArray jsonArr2 =new JSONArray(response1);
    for (int i =0;i<jsonArr2.length();i++){

        Assignedlist.add(jsonArr2.getString(i));    
    }

上に、リストとして受け入れているリストを返し、それをJson配列に変換してから、Json配列をListに変換します。

PostリクエストがJsonオブジェクトをパラメーターとして渡す場合:

   Client client = Client.create();
    WebResource webResource = client
            .resource("http://localhost:10102/NewsTickerServices/CreateJUser");
    // value added

    ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user));

    if (response.getStatus() == 500) {

        context.addMessage(null, new FacesMessage("User already exist "));
    }


0

私は現在https://github.com/kevinsawicki/http-requestを使用しています。シンプルであり、例が示されている方法が好きですが、主に私が読んだときに売られました:

依存関係は何ですか?

なし。このライブラリの目標は、いくつかの内部静的クラスを持つ単一のクラスクラスになることです。テストプロジェクトでは、実際のHTTPサーバー実装に対してリクエストをテストするためにJettyが必要です。

Java 1.6プロジェクトのいくつかの問題を整理しました。jsonをオブジェクトにデコードすることに関してgsonは無敵です:)


1
プロジェクトは死んでいるように見え、2015
。– tkruse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.