Java:在发送之前显示HttpURLConnection的请求

时间:2010-08-06 22:51:24

标签: java request httpurlconnection

我想使用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()等几个函数。)

我经常遇到这个问题,所以我自己也值得努力建立这样的功能。只需知道如何:)

4 个答案:

答案 0 :(得分:14)

您可以通过启用带有

的java.logging将HttpURLConnection置于调试模式
-Djava.util.logging.config.file=logging.properties

并将logging.properties(默认情况下在JRE_HOME \ lib中)放入以下属性

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

答案 1 :(得分:5)

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

nc -l 9999

这将侦听TCP端口9999,当HTTP客户端连接时,它将打印出请求的全文。

答案 2 :(得分:1)

接受的解决方案对我不起作用。但是做的是

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"); 
}

答案 3 :(得分:0)

使用tcpdump之类的东西,可以转储计算机发出或接收的实际网络数据包。