257

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

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

4

18 に答える 18

227

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

更新 (2020 年も活動中のプロジェクト):

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

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

于 2011-02-17T02:48:29.767 に答える
73

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

たとえば、RESTful リソース (JAXB オブジェクトのエンドポイントを使用) から XML ペイロードをルックアップするApache Camel プロジェクトの単体テスト ケースを次に示します。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 の将来のバージョンで、Jersey のものに沿った素敵なクライアント側 API が追加されることを願っています。

于 2008-10-21T12:58:39.497 に答える
66

標準の 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); 

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

于 2010-08-20T18:20:38.723 に答える
14

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]");
于 2011-02-24T20:47:25.503 に答える
9

また、完全なクライアント側機能を備えたRestlet、よりREST指向の、HttpURLConnectionやApache HTTP Client (コネクタとして利用できる)などの下位レベルのライブラリを確認することもできます。

敬具、ジェローム・ルーヴェル

于 2008-10-21T18:35:04.750 に答える
6

さらに 2 つのオプションを指摘したいと思います。

于 2011-12-25T07:48:56.980 に答える
6

jcabi-httpJdkRequestから試してください(私は開発者です)。これがどのように機能するかです:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

詳細については、このブログ投稿を確認してください: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

于 2012-04-29T12:11:40.463 に答える
6

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

于 2009-09-02T23:05:19.347 に答える
5

最近、square のRetrofit Library を試してみました。すばらしいので、残りの API を非常に簡単に呼び出すことができます。注釈ベースの構成により、定型的なコーディングの多くを取り除くことができます。

于 2014-06-07T09:09:57.963 に答える
4

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

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

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

于 2008-10-21T11:04:15.297 に答える
2

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

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

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

于 2013-01-13T12:48:14.760 に答える
1

jersey Rest クライアントの例:
依存関係の追加:

         <!-- 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 と List の応答を取得する:

       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 Request が Json オブジェクトを Parameter として渡す場合:

   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 "));
    }
于 2014-09-23T10:43:07.970 に答える
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

乾杯!

于 2014-07-20T01:32:58.037 に答える