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 类中的以下方法已被删除。

      删除的方法新方法

      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 类中的以下方法已被删除。

      删除的方法替换方法

      getTryUsePerMessageWebsocketCompression()

      getTryUsePerMessageWebSocketCompression()

      setTryUsePerMessageWebsocketCompression()

      setTryUsePerMessageWebSocketCompression()

      getTryWebsocketDeflateFrameCompression()

      getTryWebSocketDeflateFrameCompression()

      getWebsocketCompressionAllowClientNoContext()

      getWebSocketCompressionAllowClientNoContext()

      setWebsocketCompressionAllowClientNoContext()

      setWebSocketCompressionAllowClientNoContext()

      getWebsocketCompressionLevel()

      getWebSocketCompressionLevel()

      setWebsocketCompressionLevel()

      setWebSocketCompressionLevel()

      getWebsocketCompressionRequestServerNoContext()

      getWebSocketCompressionRequestServerNoContext()

      setWebsocketCompressionRequestServerNoContext()

      setWebSocketCompressionRequestServerNoContext()

    • HttpServer 类中的以下处理器方法已被删除。

      弃用的方法新方法

      websocketHandler()

      webSocketHandler()

      websocketStream()

      webSocketStream()

  • WebsocketRejectedException 已被弃用。现在,方法会引发 UpgradeRejectedException
  • HttpClient webSocket () 方法使用 Handler<AsyncResult<WebSocket>&gt; 而不是 Handler &lt ;Throwable>
  • 使用 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 连接数。value accessor 方法 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 请求使用不同的池。使用值 accessor 方法 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 中,Http Method 被声明为枚举的数据类型。作为一个枚举,它限制了 HTTP 的可扩展性。另外,它会阻止通过这个类型直接提供其他 HTTP 方法。您必须在服务器和客户端 HTTP 请求期间使用 HttpMethod.OTHER 值以及 rawMethod 属性。

如果您在交换机块中使用 HttpMethod enumerated 数据类型,您可以使用以下代码将应用程序迁移到 Eclipse Vert.x 4。

以下示例显示了 Eclipse Vert.x 3.x 版本的交换机块。

switch (method) {
  case GET:
    ...
    break;
  case OTHER:
    String s = request.getRawMethod();
    if (s.equals("PROPFIND") {
      ...
    } else ...
}

以下示例显示了 Eclipse Vert.x 4 中的交换机块。

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 交互和一些额外功能,如 HTTP 会话、JSON 编码和解码、响应 predicates,它们在 Eclipse Vert.x HTTP 客户端中不可用。

以下示例演示了如何在 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 方法 …)
  • 有可能在请求或响应时创建 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<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,否则返回了错误。

警告

当您将 HTTP 客户端与将来一起使用时,H ttpClientResponse () 方法会在收到响应时立即发出缓冲区。为避免这种情况,请确保将来在事件循环上发生在事件循环上(如示例中所示),或者应该暂停和恢复响应。

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 () 方法来执行这些操作。您可以将缓冲区、字符串或 ReadStream 作为输入传递给 send () 方法。该方法返回 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 () 方法返回异步缓冲区。使用 body () 方法而不是 bodyHandler ()

以下示例演示了如何使用 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 () 方法会返回未来。该方法删除响应正文。使用此方法,而不使用 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 () 方法处理响应。

以下示例演示了如何将 HTTP 客户端与 Eclipse Vert.x 3.x 版本的 result () 方法搭配使用。

HttpClient client = vertx.createHttpClient(options);

    client.request(HttpMethod.GET, 8443, "localhost", "/")
      .onSuccess(request -> {
        request.onSuccess(resp -> {

        //Code to handle HTTP response
        });
      });

以下示例演示了如何将 HTTP 客户端与 Eclipse Vert.x 4 中的 result () 方法搭配使用。

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 客户端请求和响应方法将异步处理程序用作输入参数

HttpClientHttpClientRequest 方法已更新,以使用异步处理程序。该方法使用 Handler<AsyncResult<HttpClientResponse> 作为输入,而不是 Handler<HttpClientResponse>

在较早版本的 Eclipse Vert.x 中,HttpClient 方法 get Now ()、选项 Now ()和 headNow () 用于返回 HttpClient Request,您必须进一步发送请求。getNow ()、 optionsNow ()headNow () 方法已被删除。在 Eclipse Vert.x 4 中,您可以使用 Handler<AsyncResult<HttpClientResponse& gt; 直接发送包含所需信息的请求。

以下示例演示了如何在 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 中,您可以使用 请求 方法创建 HttpClientRequest 实例。这些方法可用于基本交互,例如:

  • 发送请求标头
  • HTTP/2 特定的操作,如设置 push 处理程序、设置流优先级、pings 等。
  • 创建 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 () 方法调用应用中客户端请求的连接处理程序。

以下示例演示了如何在 Eclipse Vert.x 3.x 版本中使用 HttpClientRequest.connectionHandler () 方法。

client.request().connectionHandler(conn -> {
  // Connection related code
}).end();

以下示例演示了如何使用新的 HttpClient.connectionHandler () 方法。

client.connectionHandler(conn -> {
// Connection related code
});
4.6.2.3.3. 使用 net socket 方法进行 HTTP 客户端隧道

可以使用 HttpClientResponse.netSocket () 方法创建 HTTP 隧道。在 Eclipse Vert.x 4 中,此方法已更新。

要获得用于请求连接的 net socket,请在请求中发送套接字处理程序。当收到 HTTP 响应标头时,调用该处理程序。套接字可以进行隧道连接,可以发送和接收缓冲区。

以下示例演示了如何在 Eclipse Vert.x 3.x 版本中获取连接的 net socket。

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 socket。

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 中,H ttpHeaders 是一个类。

HttpHeaders 界面中添加了以下新的 MultiMap 方法。使用这些方法创建 MultiMap 实例。

  • MultiMap.headers()
  • MultiMap.set (CharSequence name, CharSequence value)
  • MultiMap.set (字符串名称、String 值)

以下示例演示了如何在 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. CaseIn sensitiveHeaders 类不再是公共的

CaseIn sensitiveHeaders 类不再是公共的。使用 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 onward 中,通过调用 HttpServerRequest.version () 方法自动检查服务器上的 HTTP 版本。当找到无效的 HTTP 版本时,方法会返回 HTTP 版本而不是抛出异常。

4.6.2.3.8. 请求选项中的新方法

在 Eclipse Vert.x 4 中,RequestOptions 类中提供了以下新方法:

  • 标头
  • 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 -> {
      //
       });
     }
})
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.