JSR 311とその実装では、RESTを介してJavaオブジェクトを公開するための強力な標準があります。ただし、クライアント側には、Apache Axis for SOAPに相当する欠けているものがあるようです。Webサービスを隠し、データを透過的にJavaオブジェクトにマーシャリングします。
Java RESTfulクライアントをどのように作成しますか?HTTPConnectionと結果の手動解析を使用していますか?または、ジャージーやApache CXRなどの専用クライアントですか?
JSR 311とその実装では、RESTを介してJavaオブジェクトを公開するための強力な標準があります。ただし、クライアント側には、Apache Axis for SOAPに相当する欠けているものがあるようです。Webサービスを隠し、データを透過的にJavaオブジェクトにマーシャリングします。
Java RESTfulクライアントをどのように作成しますか?HTTPConnectionと結果の手動解析を使用していますか?または、ジャージーやApache CXRなどの専用クライアントですか?
回答:
これは古い質問です(2008)ので、今よりも多くのオプションがあります。
更新(2020年に引き続きアクティブなプロジェクト):
HTTP / RESTクライアントの選択に関する警告。フレームワークスタックがHTTPクライアントに何を使用しているか、スレッドがどのように実行されているかを確認し、提供されている場合は理想的には同じクライアントを使用してください。つまり、Vert.xやPlayのようなものを使用している場合、フレームワークが提供するバスまたはリアクタループに参加するためにそのバッキングクライアントを使用したいと思うかもしれません。
このスレッドで述べたように、私はジャージーを使用する傾向があります 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が追加されることを願っています
標準の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をチェックすることもできます。REST指向で、HttpURLConnectionやApache HTTPクライアント(コネクタとして利用できる)などの低レベルのライブラリよりも指向的です。
よろしく、ジェロームルーベル
さらに2つのオプションを指摘したいと思います。
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
私はApache HTTPClientを使用して、すべてのHTTP側を処理します。
XMLをオブジェクトモデルに解析するXMLコンテンツ用のXML SAXパーサーを作成します。Axis2もXML-> Modelメソッドを公開していると思います(Axis 1はこの部分をうっとうしく隠しました)。XMLジェネレーターはごく単純です。
私の意見では、コーディングに時間がかからず、非常に効率的です。
OkHttpは、レトロフィットと組み合わせると軽量で強力です。これは、Androidだけでなく、一般的なJavaの使用にも適しています。
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);
}
誰も言及していないので、もう1つ、Spring Cloudで使用されるFeignがあります。
HTTPクライアントを作成して再要求するのは簡単ですが。しかし、自動生成されたクライアントを利用したい場合は、WADLを利用してコードを記述および生成できます。
RestDescribeを使用してWSDLを生成およびコンパイルできます。これを使用して、php、ruby、python、java、およびC#でクライアントを生成できます。それはきれいなコードを生成し、コード生成後に少しそれを微調整しなければならないという良い変更があります、あなたはここでツールの背後にある良いドキュメントと根底にある考えを見つけることができます。。
wintermuteで言及されている興味深い便利なWADLツールはほとんどありません。
私は、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);
}
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
乾杯!
ジャージーレストクライアントの例:
依存関係の追加:
<!-- 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 "));
}
RestAssuredを使用しましたほとんどの時間、残りのサービスの応答を解析し、サービスをテストしました。Rest Assuredとは別に、Resfulサービスと通信するために以下のライブラリも使用しました。
b。 春休みテンプレート
私は現在https://github.com/kevinsawicki/http-requestを使用しています。シンプルであり、例が示されている方法が好きですが、主に私が読んだときに売られました:
依存関係は何ですか?
なし。このライブラリの目標は、いくつかの内部静的クラスを持つ単一のクラスクラスになることです。テストプロジェクトでは、実際のHTTPサーバー実装に対してリクエストをテストするためにJettyが必要です。
Java 1.6プロジェクトのいくつかの問題を整理しました。jsonをオブジェクトにデコードすることに関してはgsonは無敵です:)