遇到的一个通用的需求就是用java程序来写get或post程序时如果能够捕获http请求和响应的过程,那会是很有帮助的。
通过fiddler可以实现以上的需求。
步骤1:安装fiddler 参考这里
【HTTP】Fiddler(一) - Fiddler简介
步骤2:在java程序中使用
模拟get请求的静态方法
/**
* 模拟get请求服务器资源
* @param strUrl
*/
public static void mimicGet(String strUrl) {
//使程序通过代理服务器( proxy server )访问Web
//代理服务器接收到从本地客户端到远程服务器的请求。代理服务器向远程服务器发出请求,再将结果转发回本地客户端。
//此处代理服务器就是fiddler
//在Java代码中调用System.setProperty ()
//使用纯粹的HTTP代理,将http.proxyHost设置为代理服务器的域名或IP地址
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyPort", "8888");
try {
URL u = new URL(encodeUrl(strUrl));
try {
try (InputStream in = new BufferedInputStream(u.openStream())) {
InputStreamReader theHTML = new InputStreamReader(in);
int c;
while ((c = theHTML.read()) != -1) {
System.out.print((char) c);
}
}
} catch (MalformedURLException ex) {
System.err.println(ex);
} catch (IOException ex) {
System.err.println(ex);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
/**
* 将queryString转换为utf-8编码的16位ASCII字符串
* https://www.baidu.com/search?wd=木&rsv_spt=1
* @param queryString 为wd=木&rsv_spt=1
* @return
*/
public static String encodeQueryString(String queryString) {
StringBuilder sb = new StringBuilder();
String[] split = queryString.split("&");
for (String str : split) {
String[] split1 = str.split("=");
try {
sb.append(URLEncoder.encode(split1[0], "utf-8"));
sb.append("=");
sb.append(URLEncoder.encode(split1[1], "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
sb.append("&");
}
String s = sb.toString();
return s.substring(0,s.length() - 1);
}
/**
* 将url字符串转换为utf-8编码的16位ASCII字符串
* @param urlStr
* @return
*/
public static String encodeUrl(String urlStr) {
int index = urlStr.lastIndexOf("?")+1;
return urlStr.substring(0, index) + encodeQueryString(urlStr.substring(index));
}
测试方法
@Test
public void testMimicGet() {
String str = "http://www.baidu.com/s?wd=木";
WebUtil.mimicGet(str);
}
Fiddler成功捕获