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 でなければエラーを返します。

警告

Future で HTTP クライアントを使用すると、HttpClientResponse() メソッドは応答を受信するとすぐにバッファーを生成します。これを回避するには、(例にあるように)event-loop で future の構成が生じるか、応答を一時停止して再開する必要があります。