对于调试问题,我想在提供一组选项时获取Unirest-Java执行的请求。我怎么能得到这个:
POST / HTTP/1.1
Host: www.some.host.tld
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
field1=FIELD1&field2=FIELD2
由此:
HttpRequest request = Unirest.post(SOMEHOST_URL)
.field("field1" , FIELD1)
.field("field2", FIELD2)
.getHttpRequest();
也就是说,如何从HttpRequest
获取完整的HTTP请求?我真的不知道要使用的代理,因为唯一一个我可以获得SSL支持工作的是Charles,并且由于某种原因它不能获得java流量。其他工具会阻塞SSL主要是因为我需要与之交谈的服务器存在缺陷,使用自签名证书和无效的主机名。所以我很乐意尝试代理,但它必须在这些条件下工作。更好的方法是从Unirest
/ HTTPClient
本身提取此信息。我已经尝试使用HttpClient
构建.setInterceptorFirst(
,但我无法从拦截器获取请求正文,只能其标题中的某些。
答案 0 :(得分:3)
不幸的是,Unirest没有一个很好的机制来获取发送的请求。但是你可以通过这样做来重建请求:
// build a request
HttpRequestWithBody request = Unirest.post(url);
request.headers = myHeaders;
request.body = myBody;
// send the request
HttpResponse<String> response = request.asString();
// print the request
System.out.println(request.getHttpMethod() + " " + request.getUrl() + " HTTP/1.1");
Map<String, List<String>> requestHeaders = request.getHeaders();
for(String key : requestHeaders.keySet()) {
List<String> values = requestHeaders.get(key);
for(String value : values) {
System.out.println(key + " : " + value);
}
}
InputStream in = loginRequest.getBody().getEntity().getContent();
String body = IOUtils.toString(in, "UTF-8");
in.close();
System.out.println(body);
答案 1 :(得分:1)
您可以使用TCPMon:https://code.google.com/p/tcpmon/
来自网站:
客户端将连接到运行tcpmon的主机上的本地端口。应在服务器名称和服务器端口中指定服务器的地址。为每个连接捕获的信息显示在由连接的本地端口标识的选项卡式面板中。
之前我使用过这个工具,它简单易用。如果您需要教程,请查看以下内容:
http://www.asjava.com/web-services/tcpmon-tutorial-web-service-debugging-tool/
<强>更新强>
TCPMon无法监控https流量。或者,您可以使用SSLDump。
ssldump的主要网站:http://www.rtfm.com/ssldump/Ssldump.html 用法示例:http://blog.facilelogin.com/2010/11/ssl-debugging-part-ii-intercepting.html
答案 2 :(得分:1)
我从未使用过Unirest,但它使用的是Apache HTTP客户端4,因此在org.apache.http上设置调试级别记录器可以为您提供所有传输的数据,包括标题和内容。
请根据您在https://hc.apache.org/httpcomponents-client-4.3.x/logging.html
使用的日志系统了解具体操作方法