Fiddler为何无法获取HttpUrlConnection发送的数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36570478/article/details/81239838

背景

(背景)

昨天下班前项目经理突然找到我说Http请求网络数据出了问题,经过一番翻阅,居然出现了一个GET_JSON,(3个问号黑人脸),看这种命名我多少还是有点懵逼的! excuse ,me ? GET里能写json ?然后继续看,原来是把json数据转为GET参数请求形式("?key1=value1&key2=value")的数据,我以为接下来就是GET完事了就,然后继续调,还是不对,那就继续进去看,竟然使用的是POST,接着又是几个好熟悉的write()方法!这下应该清楚了:将JSON数据以POST表单Form的方式提交。So, 为啥要判断的时候,不取名为POST_FORM呢?

担心下次又会遇到网络请求上的问题,毕竟也没到如火纯青的地步,于是又计划造点轮子找安慰,然而。。。(捂脸尬笑)。

实际开发过程中,为了提高开发效率于产品的稳定性,网络请求工具基本都是现成的,除了okhttp,团队也有工具,平时除了造轮子外很少接触HttpUrlConnection,所以又开始造起轮子来,一个请求、一个响应、一个View,一个页面就下来了。但是,这样似乎没有太大的收获。如果我在Android平台上写,我要建APP, 然后控件界面,安装,调试也慢,我想要的一个类就能完成了,更重要的是,手机并没有ROOT,要查看报文也不方便,于是乎,我计划使用IntelliJ IDEA(潘多拉)。


正文

怎样才能让Fiddler抓取到HttpUrlConnection发送的数据呢?

为了达到更训练自己的效果,在完成一个简单的POST表单请求代码后,我试图使用Fiddler来截取网络请求。

public class ConnectionTest {
    private void postData(String httpUrl, String postString){
        URL url = null;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(httpUrl);
            System.out.println("url.getDefaultPort():" + url.getDefaultPort());
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);
            urlConnection.connect();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream()));
            bufferedWriter.write(postString);
            bufferedWriter.close();
            int requestCode = urlConnection.getResponseCode();
            System.out.println("ResponseCode : " + requestCode);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            urlConnection.disconnect();
            url = null;
        }
    }

    public static void main(String[] args) {
        String body = "userName=zhangsan&password=123456";
        ConnectionTest test = new ConnectionTest();
        test.postData("http://www.bing.com", body, );
    }
}

运行结果如下:

一切进展的似乎顺利,405是因为bing服务器并没有提交这一数据的接口,请求通了。没有接口不是问题,搭建本地服务器就行,安装WAMP写PHP ?启动Tomcat写servlet ?直接C#写个端口监听 ?不,没这么多时间去再熟练了,最近用的JS比较多,就用Node就行。可是,Fiddler似乎并没有抓到请求报文,于是我开始试图查看Fiddler的监听端口(Tools-->Optiones-->Connections),Fiddler的默认监听端口是:8080,这而http的默认端口是80,嗯,需要修改监听端口。当我修改了Fiddler的端口后(Fiddler在端口修改完成以后需要重启Fiddler才能有效),居然还是没抓到想要的报文。发送请求的端口不是80端口?于是,我将`urlConnection`的初始化替换为如下形式,将80端口设为代理端口,于是在将Fiddler的监听端口设为80后,Fiddler顺利捕获到数据:

Proxy proxy = new Proxy(Proxy.Type.HTTP,new InetSocketAddress("127.0.0.1",80));
urlConnection = (HttpURLConnection) url.openConnection(proxy);

上述代码表示当前`url`请求使用`proxy`作为代理,另外还有一种方法设置代理:

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "80");

两种设置代理的区别在于:前者2只对`url`对应的请求设置代理,后者则会代理所有http(通过设置系统<JVM>属性实现)

猜你喜欢

转载自blog.csdn.net/weixin_36570478/article/details/81239838