JSR 311とその実装により、RESTを介してJavaオブジェクトを公開するための強力な標準が得られます。しかし、クライアント側ではSOAPのApache Axisに匹敵するものが欠けているようです - Webサービスを隠し、データを透過的にJavaオブジェクトに整列化するもの。
Java RESTfulクライアントをどのように作成しますか? HTTPConnectionを使用して結果を手動で解析するまたは例えばのための専門のクライアントジャージーそれともApache CXR?
これは古い質問(2008年)なので、当時よりはるかに多くの選択肢があります。
更新 2014年頃:
NIOサポートを提供するブロックに新たに加わりました(実際には、サーバーのようにクライアントのパフォーマンスが向上するとは思いませんが)。
UPDATE 2016:
HTTP/RESTクライアントを選ぶ際の注意点あなたのフレームワークスタックがHTTPクライアントのために何を使用しているか、それがどのようにスレッディングをするのかをチェックし、理想的にはそれを提供しているなら同じクライアントを使用する。もしあなたがVert.xやPlayのようなものを使っているなら、フレームワークが提供するどんなバスやリアクタループにも参加するためにそのバッキングクライアントを使おうとするかもしれません…そうでなければおそらく面白いスレッド問題に備えてください。
このスレッドで述べたように 私は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を追加することを願っています
標準の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);
詳しくは、以下を参照してください。
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]");
Restlet これは完全なクライアントサイド機能を持ち、HttpURLConnectionやApache HTTP Client(これはコネクタとして利用できます)のような低レベルのライブラリをもっとREST指向したものです。
よろしく、ジェロームLouvel
私は最近試しました Retrofit 正方形からのライブラリ、その素晴らしく、あなたは非常に簡単にあなたの残りのAPIを呼び出すことができます。アノテーションベースの設定は私達がボイラープレートコーディングの多くを取り除くことを可能にします。
Rapa を試すことができます。私達に同じことについてあなたのフィードバックを教えてください。そして、問題や期待される機能を気軽に記録してください。
もう2つの選択肢を指摘したいと思います。
私はApache HTTPClientを使用して、すべてのHTTP面を処理します。
XMLを解析するXMLコンテンツ用のXML SAXパーサーをあなたのオブジェクトモデルに書きます。 Axis2もXML - > Modelメソッドを公開していると思います(Axis 1はこの部分を非表示にしていました)。 XMLジェネレータは簡単です。
私の意見では、コーディングにはそれほど時間はかからず、非常に効率的です。
OkHttpはRetrofitと組み合わせると軽量で強力です。これは一般的なJavaの使用とAndroidの両方でうまく機能します。
OkHttp: http://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);
}
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
ジャージーレストクライアントの例:
依存関係を追加する
<!-- 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 "));
}
それはHTTPクライアントを作成してご依頼をするのは簡単ですが。しかし、自動生成されたクライアントを利用したい場合は、WADLを利用してコードを記述および生成することができます。
WSDLの生成とコンパイルには RestDescribe を使用できます。これを使用して、php、Ruby、python、Java、およびC#でクライアントを生成できます。それはきれいなコードを生成します、そしてあなたがコード生成の後にそれを少し微調整しなければならないという良い変化があります、あなたはツールの後ろに良いドキュメンテーションと根本的な考えを見つけることができます ここ 。
おもしろくて役に立つものはほとんどありません WADLツール wintermuteで言及されています。
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
乾杯!
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);
}