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