Java:发送HttpURLConnection请求前显示请求

24

我想使用HttpURLConnection向服务器发起一些API调用。但请求不成功,返回如下错误:

<error>
  <http_status>400 Bad Request</http_status>
  <message>Unexpected request Content-Type header ''. Expecting 'application/x-www-form-urlencoded'.</message>
</error>

我想查看被发送到服务器的“真实”内容。所谓的真实内容是指确切的HTTP请求。

有什么想法可以让我看到这个内容吗?

编辑: 基于这里的第一个答案,我应该澄清我的问题:我想避免使用像HTTP抓包或任何外部程序,我希望有一个函数或属性或其他东西来保存我正在寻找的信息。

如果不是这种情况,是否有人知道是否可以手动重建此信息(例如通过调用多个函数,例如getRequestMethod()等)?

我经常面临这个问题,因此值得花费精力自己构建这样的功能。只需要知道如何做就可以了 :)


5个回答

14

您可以通过启用java.logging将HttpURLConnection设置为调试模式。

-Djava.util.logging.config.file=logging.properties

并在 logging.properties 中添加以下属性(默认位于 JRE_HOME\lib)

sun.net.www.protocol.http.HttpURLConnection.level = ALL

我不太清楚你上面提到的那行代码应该怎么处理,我需要把它放在哪里?(使用Eclipse作为IDE) - Hirnhamster
2
您还需要设置 "java.util.logging.ConsoleHandler.level = FINEST"。 - Gili
1
@Hirnhamster,在“运行配置-参数”选项卡中,您需要添加到VM参数部分。 - RealHowTo
1
你在哪里看到“真实”发送数据的内容? - AlikElzin-kilaka
1
我在JDK 7上尝试了一下,当我将sun.net.www.protocol.http.HttpURLConnection.level更改为FINEST后,它对我起作用了。 - Andriy Simonov

5

tcpdump可以使用,但是很难让它做你想要的事情。NetCat更加用户友好(这是项目页面:http://netcat.sourceforge.net/ - 大多数Unix平台已经包含它)。

nc -l 9999

这将监听TCP端口9999,当HTTP客户端连接时,它会打印出请求的完整文本。


3

我尝试了被接受的解决方案,但并没有起作用。但是有效的方法是:

static {
    ConsoleHandler handler = new ConsoleHandler();
    handler.setLevel(Level.ALL);
    Logger log = LogManager.getLogManager().getLogger("");
    log.addHandler(handler);
    log.setLevel(Level.ALL);
    System.setProperty("javax.net.debug","all"); 
}

如何使用此功能记录请求正文? - Mehul Parmar

0
在JDK 11上,我能够记录所有的http连接,将java.util.logging.ConsoleHandler.level设置为FINEST并在默认情况下位于%JAVA_HOME%/conf的文件logging.properties中添加以下行:
sun.net.www.protocol.http.HttpURLConnection.level = FINEST
sun.net.www.protocol.http.HttpURLConnection.handlers = java.util.logging.ConsoleHandler

0
使用类似tcpdump的工具,可以转储计算机发出或接收的实际网络数据包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接