如何使用java.net.http.HttpClient记录请求/响应?

在Java 9中实验引入的HttpClient现在在Java 11中是稳定的,但毫不奇怪,似乎很少有项目真正使用它。文档几乎不存在。

在进行HTTP调用时,最普遍的问题之一是记录请求/响应。您将如何使用 ,当然,无需在每次调用中手动记录它?是否有类似于所有其他HTTP客户端提供的拦截器机制?HttpClient


答案 1

您可以通过在 Java 命令行上指定来记录请求和响应。-Djdk.httpclient.HttpClient.log=requests

至于测试/模拟,你可能想看看离线测试:http://hg.openjdk.java.net/jdk/jdk/file/tip/test/jdk/java/net/httpclient/offline/

根据您希望实现的目标,您可以使用“委托HttpClient”来拦截和记录请求和响应。

除了Java API文档之外,还有一些高级文档 http://openjdk.java.net/groups/net/httpclient/index.html

附加说明:

该属性是特定于实现的属性,其值是逗号分隔的列表,可以在 Java 命令行上配置该列表以进行诊断/调试,并使用以下值:jdk.httpclient.HttpClient.log

-Djdk.httpclient.HttpClient.log=
       errors,requests,headers,
       frames[:control:data:window:all],content,ssl,trace,channel,all

答案 2

如果我们看一下源代码,我们可以看到一些使用System.Logger的记录器,而系统.Logger又将使用System.LoggerFinder来选择记录器框架。JUL 是默认选项。记录器名称为:jdk.internal.net.http.common.DebugLogger

  • jdk.internal.httpclient.debug
  • jdk.internal.httpclient.websocket.debug
  • jdk.internal.httpclient.hpack.debug

可以通过将它们设置为系统属性来启用它们。例如,运行 with 将产生:-Djdk.internal.httpclient.debug=true

DEBUG: [main] [147ms] HttpClientImpl(1) proxySelector is sun.net.spi.DefaultProxySelector@6dde5c8c (user-supplied=false)
DEBUG: [main] [183ms] HttpClientImpl(1) ClientImpl (async) send https://http2.github.io/ GET
DEBUG: [main] [189ms] Exchange establishing exchange for https://http2.github.io/ GET,
     proxy=null
DEBUG: [main] [227ms] PlainHttpConnection(?) Initial receive buffer size is: 43690
DEBUG: [main] [237ms] PlainHttpConnection(SocketTube(1)) registering connect event
DEBUG: [HttpClient-1-SelectorManager] [239ms] SelectorAttachment Registering jdk.internal.net.http.PlainHttpConnection$ConnectEvent@354bf356 for 8 (true)
...

推荐