4.6. HTTP の変更点
本セクションでは、HTTP メソッドの変更点を説明します。
4.6.1. Eclipse Vert.x HTTP メソッドにおける一般的な更新点 リンクのコピーリンクがクリップボードにコピーされました!
以下のセクションでは、Eclipse Vert.x HTTP メソッドにおけるその他の更新を説明します。
4.6.1.1. WebSocket の HTTP メソッドの更新 リンクのコピーリンクがクリップボードにコピーされました!
WebSocket の変更点は次のとおりです。
メソッド名で
WebSocketという用語の使用に一貫性がありませんでした。メソッド名に、WebSocketではなくWebsocketなどの誤った大文字が含まれていました 。以下のクラスでWebSocketの使用に一貫性のないメソッドが削除されました。代わりに正しい大文字を持つ新しいメソッドを使用してください。HttpServerOptionsクラスの以下のメソッドが削除されました。Expand 削除されたメソッド 新しいメソッド getMaxWebsocketFrameSize()getMaxWebSocketFrameSize()setMaxWebsocketFrameSize()setMaxWebSocketFrameSize()getMaxWebsocketMessageSize()getMaxWebSocketMessageSize()setMaxWebsocketMessageSize()setMaxWebSocketMessageSize()getPerFrameWebsocketCompressionSupported()getPerFrameWebSocketCompressionSupported()setPerFrameWebsocketCompressionSupported()setPerFrameWebSocketCompressionSupported()getPerMessageWebsocketCompressionSupported()getPerMessageWebSocketCompressionSupported()setPerMessageWebsocketCompressionSupported()setPerMessageWebSocketCompressionSupported()getWebsocketAllowServerNoContext()getWebSocketAllowServerNoContext()setWebsocketAllowServerNoContext()setWebSocketAllowServerNoContext()getWebsocketCompressionLevel()getWebSocketCompressionLevel()setWebsocketCompressionLevel()setWebSocketCompressionLevel()getWebsocketPreferredClientNoContext()getWebSocketPreferredClientNoContext()setWebsocketPreferredClientNoContext()setWebSocketPreferredClientNoContext()getWebsocketSubProtocols()getWebSocketSubProtocols()setWebsocketSubProtocols()setWebSocketSubProtocols()WebSocketサブプロトコルの新しいメソッドは、項目を保存するためにコンマ区切りの文字列の代わりにList<String>データ型を使用します。HttpClientOptionsクラスの以下のメソッドが削除されました。Expand 削除されたメソッド 置き換えメソッド getTryUsePerMessageWebsocketCompression()getTryUsePerMessageWebSocketCompression()setTryUsePerMessageWebsocketCompression()setTryUsePerMessageWebSocketCompression()getTryWebsocketDeflateFrameCompression()getTryWebSocketDeflateFrameCompression()getWebsocketCompressionAllowClientNoContext()getWebSocketCompressionAllowClientNoContext()setWebsocketCompressionAllowClientNoContext()setWebSocketCompressionAllowClientNoContext()getWebsocketCompressionLevel()getWebSocketCompressionLevel()setWebsocketCompressionLevel()setWebSocketCompressionLevel()getWebsocketCompressionRequestServerNoContext()getWebSocketCompressionRequestServerNoContext()setWebsocketCompressionRequestServerNoContext()setWebSocketCompressionRequestServerNoContext()HttpServerクラスの以下のハンドラーメソッドが削除されました。Expand 非推奨となったメソッド 新しいメソッド websocketHandler()webSocketHandler()websocketStream()webSocketStream()
-
WebsocketRejectedExceptionは非推奨になりました。メソッドは、代わりにUpgradeRejectedExceptionを出力します。 -
HttpClientwebSocket()メソッドは、HandlerまたはHandler<Throwable>の代わりにHandler<AsyncResult<WebSocket>>を使用します。 -
また、
WebSocketConnectOptionsクラスのメソッドを使用して HTTP クライアントを WebSocket に接続する多重定義されたメソッドの数も削減されました。 HttpServerRequest.upgrade()メソッドが削除されました。このメソッドは同期的でした。代わりに、新しいメソッド
HttpServerRequest.toWebSocket()を使用してください。この新しいメソッドは非同期的です。以下の例は、Eclipse Vert.x 3.x での同期メソッドの使用を示しています。
// 3.x server.requestHandler(req -> { WebSocket ws = req.upgrade(); });以下の例は、Eclipse Vert.x 4 での非同期メソッドの使用を示しています。
// 4.x server.requestHandler(req -> { Future<WebSocket> fut = req.toWebSocket(); fut.onSuccess(ws -> { }); });
4.6.1.2. WebSocket 接続の数の設定 リンクのコピーリンクがクリップボードにコピーされました!
Eclipse Vert.x 3.x では、HTTP クライアントプールサイズを使用してアプリケーションで WebSocket 接続の最大数を定義することができます。値アクセサーメソッド HttpClientOptions.maxPoolSize() は、WebSocket 接続の取得および設定に使用されました。デフォルトの接続数は、エンドポイントごとに 4 に設定されました。
以下の例は、Eclipse Vert.x 3.x で WebSocket 接続が設定される方法を示しています。
// 3.x
options.setMaxPoolSize(30); // Maximum connection is set to 30 for each endpoint
しかし、Eclipse Vert.x 4 では、使用後に接続が閉じられるため、WebSocket TCP 接続のプールはありません。アプリケーションは、HTTP リクエストに異なるプールを使用します。値のアクセサーメソッド HttpClientOptions.maxWebSockets() を使用して WebSocket 接続を取得および設定します。デフォルトの接続数は、エンドポイントごとに 50 に設定されます。
以下の例は、Eclipse Vert.x 4 で WebSocket 接続を設定する方法を示しています。
// 4.x
options.setMaxWebSockets(30); // Maximum connection is set to 30 for each endpoint
4.6.1.3. HttpMethod がインターフェイスとして利用可能 リンクのコピーリンクがクリップボードにコピーされました!
HttpMethod は新しいインターフェイスとして利用できます。
以前のリリースの Eclipse Vert.x では、HttpMethod は列挙型として宣言されていました。列挙として、HTTP の拡張性が制限されます。さらに、このタイプの他の HTTP メソッドを直接提供できませんでした。サーバーおよびクライアントの HTTP 要求時に、HttpMethod.OTHER の値を rawMethod 属性と共に使用する必要がありました。
スイッチブロックで HttpMethod 列挙データ型を使用している場合は、以下のコードを使用してアプリケーションを Eclipse Vert.x 4 に移行できます。
以下の例は、Eclipse Vert.x 3.x リリースの switch ブロックを示しています。
switch (method) {
case GET:
...
break;
case OTHER:
String s = request.getRawMethod();
if (s.equals("PROPFIND") {
...
} else ...
}
以下の例は、Eclipse Vert.x 4 の switch ブロックを示しています。
switch (method.name()) {
case "GET":
...
break;
case "PROPFIND";
...
break;
}
Eclipse Vert.x 4 で以下のコードを使用することもできます。
HttpMethod PROPFIND = HttpMethod.valueOf("PROPFIND");
if (method == HttpMethod.GET) {
...
} else if (method.equals(PROPFIND)) {
...
} else {
...
}
アプリケーションで HttpMethod.OTHER 値を使用している場合は、以下のコードを使用してアプリケーションを Eclipse Vert.x 4 に移行します。
以下の例は、Eclipse Vert.x 3.x リリースのコードを示しています。
client.request(HttpMethod.OTHER, ...).setRawName("PROPFIND");
以下の例は、Eclipse Vert.x 4 のコードを示しています。
client.request(HttpMethod.valueOf("PROPFIND"), ...);
4.6.2. HTTP クライアントの変更点 リンクのコピーリンクがクリップボードにコピーされました!
本セクションでは、HTTP クライアントの変更点を説明します。
以下のタイプの Eclipse Vert.x クライアントを利用できます。
- Eclipse Vert.x Web クライアント
- アプリケーションが Web 指向の場合は、Eclipse Vert.x Web クライアントを使用します。たとえば、REST、HTTP ペイロードのエンコーディングおよびデコーディング、HTTP ステータス応答コードの解釈などです。
- Eclipse Vert.x HTTP クライアント
- アプリケーションが HTTP プロキシーとして使用される場合は、Eclipse Vert.x HTTP クライアントを使用します。たとえば、API ゲートウェイとしてです。HTTP クライアントが更新され、Eclipse Vert.x 4 で改善されました。
Eclipse Vert.x Web クライアントは Eclipse Vert.x HTTP クライアントに基づいています。
4.6.2.1. アプリケーションの Eclipse Vert.x Web クライアントへの移行 リンクのコピーリンクがクリップボードにコピーされました!
Web クライアントは Eclipse Vert.x 3.4.0 リリースから入手できました。Eclipse Vert.x 4 では、Web クライアントに変更点はありません。
クライアントは、簡素化された HTTP 対話と、Eclipse Vert.x HTTP クライアントでは利用できない HTTP セッション、JSON エンコーディングおよびデコーディング、応答述語などの追加機能を提供します。
以下の例は、Eclipse Vert.x 3.x リリースで HTTP クライアントを使用する方法を示しています。
HttpClientRequest request = client.get(80, "example.com", "/", response -> {
int statusCode = response.statusCode();
response.exceptionHandler(err -> {
// Handle connection error, for example, connection closed
});
response.bodyHandler(body -> {
// Handle body entirely
});
});
request.exceptionHandler(err -> {
// Handle connection error OR response error
});
request.end();
以下の例は、Eclipse Vert.x 3.x リリースおよび Eclipse Vert.x 4 リリースで、アプリケーションを Web クライアントに移行する方法を示しています。
client.get(80, "example.com", "/some-uri")
.send(ar -> {
if (ar.suceeded()) {
HttpResponse<Buffer> response = ar.result();
// Handle response
} else {
// Handle error
}
});
4.6.2.2. アプリケーションの Eclipse Vert.x HTTP クライアントへの移行 リンクのコピーリンクがクリップボードにコピーされました!
HTTP クライアントは、HTTP の対話を詳細に制御し、HTTP プロトコルに焦点をあてます。
Eclipse Vert.x 4 で HTTP クライアントが更新され、改善されました。
- より少ない対話による簡素化された API
- 強固なエラー処理
- HTTP/1 の接続リセットのサポート
HTTP クライアント API の更新は以下のとおりです。
-
HttpClientRequestで、get()、delete()、put()などのメソッドが削除されました。代わりにHttpClientRequest> request(HttpMethod method, …)メソッドを使用してください。 -
要求または応答が可能になると、
HttpClientRequestインスタンスが作成されます。たとえば、HttpClientRequestインスタンスは、クライアントがサーバーに接続するか、プールから接続を再利用するときに作成されます。
4.6.2.2.1. シンプルな要求の送信 リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、Eclipse Vert.x 3.x リリースで GET 要求を送信する方法を示しています。
HttpClientRequest request = client.get(80, "example.com", "/", response -> {
int statusCode = response.statusCode();
response.exceptionHandler(err -> {
// Handle connection error, for example, connection closed
});
response.bodyHandler(body -> {
// Handle body entirely
});
});
request.exceptionHandler(err -> {
// Handle connection error OR response error
});
request.end();
以下の例は、Eclipse Vert.x 4 で GET 要求を送信する方法を示しています。
client.request(HttpMethod.GET, 80, "example.com", "/", ar -> {
if (ar.succeeded()) {
HttpClientRequest = ar.result();
request.send(ar2 -> {
if (ar2.succeeded()) {
HttpClientResponse = ar2.result();
int statusCode = response.statusCode();
response.body(ar3 -> {
if (ar3.succeeded()) {
Buffer body = ar3.result();
// Handle body entirely
} else {
// Handle server error, for example, connection closed
}
});
} else {
// Handle server error, for example, connection closed
}
});
} else {
// Connection error, for example, invalid server or invalid SSL certificate
}
});
新しい HTTP クライアントでエラー処理が優れていることが分かります。
以下の例は、Eclipse Vert.x 4 の GET 操作で future 設定を使用する方法を示しています。
Future<Buffer> fut = client.request(HttpMethod.GET, 80, "example.com", "/")
.compose(request -> request.send().compose(response -> {
int statusCode = response.statusCode();
if (statusCode == 200) {
return response.body();
} else {
return Future.failedFuture("Unexpectd status code");
}
})
});
fut.onComplete(ar -> {
if (ar.succeeded()) {
Buffer body = ar.result();
// Handle body entirely
} else {
// Handle error
}
});
今後の設定により、例外処理が改善されます。この例では、ステータスコードが 200 かどうかを確認し、200 でないとエラーを返します。
future で HTTP クライアントを使用すると、HttpClientResponse() メソッドは応答を受信するとすぐにバッファーを生成し始めます。これを回避するには、(例にあるように) event-loop で future の設定が生じるか、応答を一時停止して再開する必要があります。
4.6.2.2.2. リクエストの送信 リンクのコピーリンクがクリップボードにコピーされました!
Eclipse Vert.x 3.x リリースでは、end() メソッドを使用して要求を送信できます。
request.end();
要求にボディーを送信することもできます。
request.end(Buffer.buffer("hello world));
HttpClientRequest は Writestream<Buffer> であるため、要求をストリーミングするのにパイプを使用することもできます。
writeStream.pipeTo(request, ar -> {
if (ar.succeeded()) {
// Sent the stream
}
});
Eclipse Vert.x 4 では、get() メソッドを使用して例に示されるすべての操作を実行できます。新しい send() メソッドを使用してこれらの操作を実行することもできます。send() メソッドへの入力として、バッファー、文字列、または ReadStream を渡すことができます。このメソッドは、HttpClientResponse インスタンスを返します。
// Send a request and process the response
request.onComplete(ar -> {
if (ar.succeeded()) {
HttpClientResponse response = ar.result();
// Handle the response
}
})
request.end();
// The new send method combines all the operations
request.send(ar -> {
if (ar.succeeded()) {
HttpClientResponse response = ar.result();
// Handle the response
}
}));
4.6.2.2.3. 応答の処理 リンクのコピーリンクがクリップボードにコピーされました!
HttpClientResponse インターフェイスが更新され、以下の方法で改善されました。
body()メソッドbody()メソッドは非同期バッファーを返します。bodyHandler()の代わりにbody()メソッドを使用します。以下の例は、
bodyHandler()メソッドを使用して要求ボディーを取得する方法を示しています。response.bodyHandler(body -> { // Process the request body }); response.exceptionHandler(err -> { // Could not get the request body });以下の例は、
body()メソッドを使用して要求ボディーを取得する方法を示しています。response.body(ar -> { if (ar.succeeded()) { // Process the request body } else { // Could not get the request body } });end()メソッドend()メソッドは、応答が正常または失敗した場合に future の結果を返します。このメソッドは応答ボディーを削除します。endHandler()メソッドの代わりにこのメソッドを使用してください。以下の例は、
endHandler()メソッドを使用する方法を示しています。response.endHandler(v -> { // Response ended }); response.exceptionHandler(err -> { // Response failed, something went wrong });以下の例は、
end()メソッドの使用方法を示しています。response.end(ar -> { if (ar.succeeded()) { // Response ended } else { // Response failed, something went wrong } });
onSucces()、compose()、bodyHandler() などのメソッドで応答を処理することもできます。以下の例は、onSuccess() メソッドを使用して応答を処理する方法を示しています。
以下の例は、Eclipse Vert.x 3.x リリースにおいて、result() メソッドで HTTP クライアントを使用する方法を示しています。
HttpClient client = vertx.createHttpClient(options);
client.request(HttpMethod.GET, 8443, "localhost", "/")
.onSuccess(request -> {
request.onSuccess(resp -> {
//Code to handle HTTP response
});
});
以下の例は、Eclipse Vert.x 4 の result() メソッドで HTTP クライアントを使用する方法を示しています。
HttpClient client = vertx.createHttpClient(options);
client.request(HttpMethod.GET, 8443, "localhost", "/")
.onSuccess(request -> {
request.response().onSuccess(resp -> {
//Code to handle HTTP response
});
});
4.6.2.3. Eclipse Vert.x HTTP クライアントの改善 リンクのコピーリンクがクリップボードにコピーされました!
本セクションでは、HTTP クライアントの改善を説明します。
4.6.2.3.1. HTTP クライアント要求と応答メソッドが非同期ハンドラーを入力引数として取る リンクのコピーリンクがクリップボードにコピーされました!
HttpClient メソッドおよび HttpClientRequest メソッドが更新され、非同期ハンドラーが使用されるようになりました。このメソッドは、Handler<HttpClientResponse> の代わりに、Handler<AsyncResult<HttpClientResponse>> を入力として取ります。
以前のリリースの Eclipse Vert.x では、リクエストを実行するためにさらに送信する必要がある HttpClientRequest を返すのに HttpClient メソッドの getNow()、optionsNow()、および headNow() が使用されていました。getNow() メソッド、optionsNow() メソッド、および headNow() メソッドが削除されました。Eclipse Vert.x 4 では、Handler<AsyncResult<HttpClientResponse>> を使用して、必要な情報で要求を直接送信できます。
以下の例は、Eclipse Vert.x 3.x で要求を送信する方法を示しています。
GET 操作を実行するには、以下を実行します。
Future<HttpClientResponse> f1 = client.get(8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"));バッファーボディーを持つ POST を行うには、以下を行います。
Future<HttpClientResponse> f2 = client.post(8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"), Buffer.buffer("some-data"));ストリーミングボディーを使用した POST を行うには、次のコマンドを実行します。
Future<HttpClientResponse> f3 = client.post(8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"), asyncFile);
Eclipse Vert.x 4 では、requests メソッドを使用して HttpClientRequest インスタンスを作成できます。これらのメソッドは、以下のような基本的な対話で使用できます。
- リクエストヘッダーの送信
- プッシュハンドラー、ストリームの優先度、ping の設定などの HTTP/2 固有の操作。
- NetSocket トンネルの作成
- 粒度の細かい書き込み制御を提供
- ストリームのリセット
- 100 継続ヘッダーの手動処理
以下の例は、Eclipse Vert.x 4 で HTTPClientRequest を作成する方法を示しています。
client.request(HttpMethod.GET, 8080, "example.com", "/resource", ar -> {
if (ar.succeeded()) {
HttpClientRequest request = ar.result();
request.putHeader("content-type", "application/json")
request.send(new JsonObject().put("hello", "world"))
.onSuccess(response -> {
//
}).onFailure(err -> {
//
});
}
})
4.6.2.3.2. HTTP クライアント要求から接続ハンドラーメソッドを削除 リンクのコピーリンクがクリップボードにコピーされました!
HttpClientRequest.connectionHandler() メソッドが削除されました。代わりに HttpClient.connectionHandler() メソッドを使用して、アプリケーションのクライアントリクエストの接続ハンドラーを呼び出します。
以下の例は、HttpClientRequest.connectionHandler() メソッドが Eclipse Vert.x 3.x リリースでどのように使用されたかを示しています。
client.request().connectionHandler(conn -> {
// Connection related code
}).end();
以下の例は、新しい HttpClient.connectionHandler() メソッドを使用する方法を表しています。
client.connectionHandler(conn -> {
// Connection related code
});
4.6.2.3.3. net ソケットメソッドを使用した HTTP クライアントトンネリング リンクのコピーリンクがクリップボードにコピーされました!
HTTP トンネルは、HttpClientResponse.netSocket() メソッドを使用して作成できます。Eclipse Vert.x 4 では、このメソッドが更新されました。
要求の接続に net ソケットを取得するには、要求でソケットハンドラーを送信します。ハンドラーは、HTTP 応答ヘッダーの受信時に呼び出されます。ソケットはトンネリングの準備ができ、バッファーの送受信が可能です。
以下の例は、Eclipse Vert.x 3.x リリースで接続の net ソケットを取得する方法を示しています。
client.request(HttpMethod.CONNECT, uri, ar -> {
if (ar.succeeded()) {
HttpClientResponse response = ar.result();
if (response.statusCode() == 200) {
NetSocket so = response.netSocket();
}
}
}).end();
以下の例は、Eclipse Vert.x 4 で接続の net ソケットを取得する方法を示しています。
client.request(HttpMethod.CONNECT, uri, ar -> {
}).netSocket(ar -> {
if (ar.succeeded()) {
// Got a response with a 200 status code
NetSocket so = ar.result();
// Go for tunneling
}
}).end();
4.6.2.3.4. HttpClient クラスの新しい send() メソッド リンクのコピーリンクがクリップボードにコピーされました!
HttpClient クラスで新しい send() メソッドを利用可能
以下のコードは、Eclipse Vert.x 4 で要求を送信する方法を示しています。
Future<HttpClientResponse> f1 = client.send(HttpMethod.GET, 8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"));
4.6.2.3.5. HttpHeaders はインターフェイスで、MultiMap メソッドを含む リンクのコピーリンクがクリップボードにコピーされました!
Eclipse Vert.x 4 では、HttpHeaders はインターフェイスです。以前のリリースの Eclipse Vert.x では、HttpHeaders はクラスでした。
以下の新しい MultiMap メソッドが HttpHeaders インターフェイスに追加されました。これらのメソッドを使用して MultiMap インスタンスを作成します。
-
MultiMap.headers() -
MultiMap.set(CharSequence name, CharSequence value) -
MultiMap.set(String name, String value)
以下の例は、Eclipse Vert.x 3.x リリースで MultiMap インスタンスが作成された方法を示しています。
MultiMap headers = MultiMap.caseInsensitiveMultiMap();
以下の例は、Eclipse Vert.x 4 で MultiMap インスタンスを作成する方法を示しています。
MultiMap headers = HttpHeaders.headers();
MultiMap headers = HttpHeaders.set("content-type", "application.data");
4.6.2.3.6. CaseInsensitiveHeaders クラスが公開されなくなる リンクのコピーリンクがクリップボードにコピーされました!
CaseInsensitiveHeaders クラスが公開されなくなりました。MultiMap.caseInsensitiveMultiMap() メソッドを使用して、大文字と小文字を区別しないキーを持つマルチマップ実装を作成します。
以下の例は、Eclipse Vert.x 3.x リリースで CaseInsensitiveHeaders メソッドがどのように使用されたかを示しています。
CaseInsensitiveHeaders headers = new CaseInsensitiveHeaders();
以下の例は、Eclipse Vert.x 4 で MultiMap メソッドを使用する方法を示しています。
MultiMap multiMap = MultiMap#caseInsensitiveMultiMap();
または
MultiMap headers = HttpHeaders.headers();
4.6.2.3.7. サーバーで実行している HTTP のバージョンの確認 リンクのコピーリンクがクリップボードにコピーされました!
以前のリリースの Eclipse Vert.x では、HttpServerRequest.version() メソッドを明示的に呼び出している場合に限り、サーバーで実行している HTTP のバージョンががチェックされました。HTTP バージョンが HTTP/1.x の場合、メソッドは 501 HTTP ステータスを返し、接続を閉じます。
Eclipse Vert.x 4 以降、要求がサーバーに送信される前に、サーバー上の HTTP バージョンは HttpServerRequest.version() メソッドを呼び出して自動的にチェックされます。このメソッドは、無効な HTTP バージョンが見つかったときに例外を出力する代わりに、HTTP バージョンを返します。
4.6.2.3.8. 要求オプションの新しいメソッド リンクのコピーリンクがクリップボードにコピーされました!
Eclipse Vert.x 4 では、以下の新しいメソッドが RequestOptions クラスで利用できます。
- Header
- FollowRedirects
- Timeout
以下の例は、新しいメソッドの使用例を示しています。
client.request(HttpMethod.GET, 8080, "example.com", "/resource", ar -> {
if (ar.succeeded()) {
HttpClientRequest request = ar.result();
request.putHeader("content-type", "application/json")
request.send(new JsonObject().put("hello", "world"))
.onSuccess(response -> {
//
}).onFailure(err -> {
//
});
}
})