web-dev-qa-db-ja.com

REST Java用クライアント?

JSR 311とその実装により、RESTを介してJavaオブジェクトを公開するための強力な標準が得られます。しかし、クライアント側ではSOAPのApache Axisに匹敵するものが欠けているようです - Webサービスを隠し、データを透過的にJavaオブジェクトに整列化するもの。

Java RESTfulクライアントをどのように作成しますか? HTTPConnectionを使用して結果を手動で解析するまたは例えばのための専門のクライアントジャージーそれともApache CXR?

215
Yaba

これは古い質問(2008年)なので、当時よりはるかに多くの選択肢があります。

更新 2014年頃:

NIOサポートを提供するブロックに新たに加わりました(実際には、サーバーのようにクライアントのパフォーマンスが向上するとは思いませんが)。

UPDATE 2016

  • OkHttp - より新しいHTTPプロトコル(SPDYとHTTP2)をサポートします。 Android上で動作します。残念ながらそれは本当のリアクターループベースの非同期オプションを提供しません(上記のNingとHTTPコンポーネントを見てください)。ただし、新しいHTTP 2プロトコルを使用している場合、これはそれほど問題になりません(接続数に問題があると想定して)。
  • Retrofit - 一部のJerseyおよびCXF拡張と同様に、インターフェイススタブに基づいてクライアントを自動作成します。 OkHttpを使用します。
  • Apache HttpComponents 5はおそらくHTTP 2をサポートするでしょう

HTTP/RESTクライアントを選ぶ際の注意点あなたのフレームワークスタックがHTTPクライアントのために何を使用しているか、それがどのようにスレッディングをするのかをチェックし、理想的にはそれを提供しているなら同じクライアントを使用する。もしあなたがVert.xやPlayのようなものを使っているなら、フレームワークが提供するどんなバスやリアクタループにも参加するためにそのバッキングクライアントを使おうとするかもしれません…そうでなければおそらく面白いスレッド問題に備えてください。

179
Adam Gent

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

これは単体テストのケースです from Apache Camelプロジェクト はRESTfulリソースからXMLペイロードを検索します(JAXBオブジェクトEndpointsを使用)。 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のものに沿ってNiceクライアントサイドAPIを追加することを願っています

70
James Strachan

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

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

60
bdoughan

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]");
11
Johan

Restlet これは完全なクライアントサイド機能を持ち、HttpURLConnectionやApache HTTP Client(これはコネクタとして利用できます)のような低レベルのライブラリをもっとREST指向したものです。

よろしく、ジェロームLouvel

10
Jerome Louvel

私は最近試しました Retrofit 正方形からのライブラリ、その素晴らしく、あなたは非常に簡単にあなたの残りのAPIを呼び出すことができます。アノテーションベースの設定は私達がボイラープレートコーディングの多くを取り除くことを可能にします。

7

Rapa を試すことができます。私達に同じことについてあなたのフィードバックを教えてください。そして、問題や期待される機能を気軽に記録してください。

7
HariKrishnan

もう2つの選択肢を指摘したいと思います。

6
Ophir Radnitz

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

XMLを解析するXMLコンテンツ用のXML SAXパーサーをあなたのオブジェクトモデルに書きます。 Axis2もXML - > Modelメソッドを公開していると思います(Axis 1はこの部分を非表示にしていました)。 XMLジェネレータは簡単です。

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

5
JeeBee

OkHttpはRetrofitと組み合わせると軽量で強力です。これは一般的なJavaの使用とAndroidの両方でうまく機能します。

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);
}
5
Sam Edwards

誰も言及していないので、ここで別のものです: によって使用される Feign

4
Leon

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

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

4
yegor256

しばらくの間、私は Resty を使っています。

JSONResource jsonResource = new Resty().json(uri);

いくつかの例を見つけることができます ここ

2
aribeiro

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

         <!-- 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);

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

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

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

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 "));
    }
1

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

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

おもしろくて役に立つものはほとんどありません WADLツール wintermuteで言及されています。

1
GG.

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

乾杯!

1
g00dnatur3

JavaインターフェースをリモートのJSON RESTサービスにマッピングするライブラリを書きました。

https://github.com/ggeorgovassilis/spring-rest-invoker

public interface BookService {
   @RequestMapping("/volumes")
   QueryResult findBooksByTitle(@RequestParam("q") String q);

   @RequestMapping("/volumes/{id}")
   Item findBookById(@PathVariable("id") String id);
}