REST Javaコードからの呼び出し:
_<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22.1</version>
</dependency>
_
私のGETリクエストでは、
_javax.ws.rs.client.Invocation.Builder builder = ClientBuilder.newClient().target(url).request();
builder.get().readEntity(String.class);
_
readEntity(String.class)
を呼び出した後、クライアントは閉じられます自動的に。
私が使うなら、
_builder.get(String.class);
_
同じ出力が得られます。
この場合、接続は自動的に閉じられますか、それとも手動で閉じる必要がありますか?
次のコードについて考えてみます。
_Client client = ClientBuilder.newClient();
String result = client.target(url).request().get(String.class);
_
内部的には、リクエストが成功し、接続が閉じられると、Jerseyは Response#readEntity(Class<T>)
を呼び出します。 したがって、この状況では接続を手動で閉じる必要はありません。
ここで、次のコードについて考えてみます。
_Client client = ClientBuilder.newClient();
Response response = client.target(url).request().get();
_
この状況では、接続を閉じるために Response#close()
を呼び出す必要があります。または、 Response#readEntity(Class<T>)
を呼び出して、Jerseyに接続を閉じさせます。
ドキュメント で述べたように、 エンティティを読み取る でない場合は、 Response#close()
を呼び出して手動で応答を閉じる必要があります。 。
詳細については、接続を閉じる方法について、Jerseyの ドキュメント を参照してください。
基になる接続は、要求ごとに開かれ、応答が受信されてエンティティが処理された後(エンティティが読み取られた後)に閉じられます。次の例を参照してください。
_final WebTarget target = ... some web target Response response = target.path("resource").request().get(); System.out.println("Connection is still open."); System.out.println("string response: " + response.readEntity(String.class)); System.out.println("Now the connection is closed.");
_エンティティを読み取らない場合は、
response.close()
によって手動で応答を閉じる必要があります。また、エンティティが
InputStream
(response.readEntity(InputStream.class)
によって)に読み込まれた場合、接続はInputStream
。その場合、InputStream
またはResponse
は、InputStream
。
さらに、 JerseyInvocation
source をご覧ください。最も重要な部分を以下に引用します。
translate(ClientResponse, RequestScope, Class<T>)
メソッドでは、response.readEntity(Class<T>)
が呼び出されていることがわかります。
JerseyInvocation.Builder#get(Class<T>)
現在のリクエストに対してHTTPGET
メソッドを同期的に呼び出します。
_@Override
public <T> T get(final Class<T> responseType)
throws ProcessingException, WebApplicationException {
return method("GET", responseType);
}
_
JerseyInvocation.Builder#method(String, Class<T>)
現在のリクエストに対して任意のメソッドを同期的に呼び出します。
_@Override
public <T> T method(final String name, final Class<T> responseType)
throws ProcessingException, WebApplicationException {
// responseType null check omitted for brevity
requestContext.setMethod(name);
return new JerseyInvocation(this).invoke(responseType);
}
_
JerseyInvocation#invoke(Class<T>)
要求を同期的に呼び出し、指定されたタイプの応答を受信します。
_@Override
public <T> T invoke(final Class<T> responseType)
throws ProcessingException, WebApplicationException {
// responseType null check omitted for brevity
final ClientRuntime runtime = request().getClientRuntime();
final RequestScope requestScope = runtime.getRequestScope();
return requestScope.runInScope(new Producer<T>() {
@Override
public T call() throws ProcessingException {
try {
return translate(runtime.invoke(requestForCall(requestContext)),
requestScope, responseType);
} catch (final ProcessingException ex) {
// Exception handling omitted for brevity
}
}
});
}
_
JerseyInvocation#translate(ClientResponse, RequestScope, Class<T>)
リクエストが成功した場合、レスポンスエンティティは指定されたJava type using Response#readEntity(Class<T>)
:
_private <T> T translate(final ClientResponse response, final RequestScope scope,
final Class<T> responseType) throws ProcessingException {
if (responseType == Response.class) {
return responseType.cast(new InboundJaxrsResponse(response, scope));
}
if (response.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL) {
try {
return response.readEntity(responseType);
} catch (final ProcessingException ex) {
// Exception handling omitted for brevity
}
} else {
throw convertToException(new InboundJaxrsResponse(response, scope));
}
}
_