Fiddler爲何無法獲取HttpUrlConnection發送的數據

背景

(背景)

昨天下班前項目經理突然找到我說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>屬性實現)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章