亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Flutter中http請(qǐng)求抓包的完美解決方案

2019-10-21 21:19:25
字體:
供稿:網(wǎng)友

前言

前陣子有同學(xué)反饋Flutter中的http請(qǐng)求無法通過fiddler抓包,作者喜歡使用Charles抓包工具,于是抽時(shí)間寫了個(gè)小demo測試了一下,結(jié)論是在手機(jī)上設(shè)置代理,Charles確實(shí)抓不到請(qǐng)求數(shù)據(jù)包。于是對(duì)該問題進(jìn)行了分析:

  • 確定使用的是http發(fā)起的get請(qǐng)求,理論上http協(xié)議應(yīng)該可以被Charles抓到包的,如果沒有抓到包,那可能是沒有走代理,于是乎通過將筆記本連接的wifi斷開測試了一下手機(jī)上APP發(fā)起http請(qǐng)求,發(fā)現(xiàn)請(qǐng)求成功,證實(shí)確實(shí)沒有走代理;
  • 為什么http請(qǐng)求沒有通過wifi走代理呢,因?yàn)橹鞍沧吭褂玫囊恍﹉ttp框架都是正常走代理的啊,那是不是有可能代碼中有api方法可以設(shè)置請(qǐng)求不走代理,于是乎就研讀了一下Flutter中http相關(guān)的源碼,最終找到了答案。

http請(qǐng)求源碼跟蹤

http.dart中的HttpClient是一個(gè)抽象類,成員方法的具體實(shí)現(xiàn)在http_impl.dart中,http的get請(qǐng)求實(shí)現(xiàn)如下:

Future<HttpClientRequest> getUrl(Uri url) => _openUrl("get", url);Future<_HttpClientRequest> _openUrl(String method, Uri uri) { . . . // Check to see if a proxy server should be used for this connection. var proxyConf = const _ProxyConfiguration.direct(); if (_findProxy != null) { // TODO(sgjesse): Keep a map of these as normally only a few // configuration strings will be used. try { proxyConf = new _ProxyConfiguration(_findProxy(uri)); } catch (error, stackTrace) { return new Future.error(error, stackTrace); } } return _getConnection(uri.host, port, proxyConf, isSecure) .then((_ConnectionInfo info) { . . . });}

首先,我們可以發(fā)現(xiàn)方法中有一行注釋// Check to see if a proxy server should be used for this connection.,意思是“檢查是否應(yīng)該使用代理服務(wù)器進(jìn)行此連接”;

然后,有一個(gè)proxyConf對(duì)象初始化和根據(jù)_findProxy來創(chuàng)建新的proxyConf對(duì)象的語句,然后通過_getConnection(uri.host, port, proxyConf, isSecure)來創(chuàng)建連接,_getConnection的源碼如下:

Future<_ConnectionInfo> _getConnection(String uriHost, int uriPort, _ProxyConfiguration proxyConf, bool isSecure) { Iterator<_Proxy> proxies = proxyConf.proxies.iterator; Future<_ConnectionInfo> connect(error) { if (!proxies.moveNext()) return new Future.error(error); _Proxy proxy = proxies.current; String host = proxy.isDirect ? uriHost : proxy.host; int port = proxy.isDirect ? uriPort : proxy.port; return _getConnectionTarget(host, port, isSecure) .connect(uriHost, uriPort, proxy, this) // On error, continue with next proxy. .catchError(connect); } return connect(new HttpException("No proxies given"));}

從代碼中我們可以看到根據(jù)代理配置信息來將請(qǐng)求的host和port進(jìn)行重置,然后創(chuàng)建真實(shí)的連接。

跟蹤以上源碼我們發(fā)現(xiàn)dart中http請(qǐng)求是否走代理是需要配置的,而_findProxy變量和配置的代理信息有關(guān)。

http__impl.dart文件中的_HttpClient類中定義了_findProxy的默認(rèn)值

Function _findProxy = HttpClient.findProxyFromEnvironment;

HttpClient類中findProxyFromEnvironment方法的實(shí)現(xiàn)

static String findProxyFromEnvironment(Uri url, {Map<String, String> environment}) { HttpOverrides overrides = HttpOverrides.current; if (overrides == null) { return _HttpClient._findProxyFromEnvironment(url, environment); } return overrides.findProxyFromEnvironment(url, environment);}

_HttpClient類中_findProxyFromEnvironment方法的實(shí)現(xiàn)

static String _findProxyFromEnvironment( Uri url, Map<String, String> environment) { checkNoProxy(String option) { if (option == null) return null; Iterator<String> names = option.split(",").map((s) => s.trim()).iterator; while (names.moveNext()) { var name = names.current; if ((name.startsWith("[") && name.endsWith("]") && "[${url.host}]" == name) || (name.isNotEmpty && url.host.endsWith(name))) { return "DIRECT"; } } return null; } checkProxy(String option) { if (option == null) return null; option = option.trim(); if (option.isEmpty) return null; int pos = option.indexOf("://"); if (pos >= 0) { option = option.substring(pos + 3); } pos = option.indexOf("/"); if (pos >= 0) { option = option.substring(0, pos); } // Add default port if no port configured. if (option.indexOf("[") == 0) { var pos = option.lastIndexOf(":"); if (option.indexOf("]") > pos) option = "$option:1080"; } else { if (option.indexOf(":") == -1) option = "$option:1080"; } return "PROXY $option"; } // Default to using the process current environment. if (environment == null) environment = _platformEnvironmentCache; String proxyCfg; String noProxy = environment["no_proxy"]; if (noProxy == null) noProxy = environment["NO_PROXY"]; if ((proxyCfg = checkNoProxy(noProxy)) != null) { return proxyCfg; } if (url.scheme == "http") { String proxy = environment["http_proxy"]; if (proxy == null) proxy = environment["HTTP_PROXY"]; if ((proxyCfg = checkProxy(proxy)) != null) { return proxyCfg; } } else if (url.scheme == "https") { String proxy = environment["https_proxy"]; if (proxy == null) proxy = environment["HTTPS_PROXY"]; if ((proxyCfg = checkProxy(proxy)) != null) { return proxyCfg; } } return "DIRECT";}

從以上代碼中可以發(fā)現(xiàn)代理配置從environment中讀取,設(shè)置代理時(shí)必須指定http_proxy或https_proxy等。而從_openUrl方法實(shí)現(xiàn)中proxyConf = new _ProxyConfiguration(_findProxy(uri));得出默認(rèn)情況下environment是為空的,所以要想在Flutter的http請(qǐng)求中使用代理,則要指定相應(yīng)的代理配置,即設(shè)置httpClient.findProxy的值。

示例代碼:

_getHttpData() async { var httpClient = new HttpClient(); httpClient.findProxy = (url) { return HttpClient.findProxyFromEnvironment(url, environment: {"http_proxy": 'http://192.168.124.7:8888',}); }; var uri = new Uri.http('t.weather.sojson.com', '/api/weather/city/101210101'); var request = await httpClient.getUrl(uri); var response = await request.close(); if (response.statusCode == 200) { print('請(qǐng)求成功'); var responseBody = await response.transform(Utf8Decoder()).join(); print('responseBody = $responseBody'); } else { print('請(qǐng)求失敗'); }}

以上代碼設(shè)置后即可使用Fiddler或Charles抓包了。

注:

  • 代碼中已設(shè)置代理,手機(jī)wifi不再需要進(jìn)行代理設(shè)置;
  • 192.168.124.7該IP為我們需要抓包的Charles所在電腦IP;

第二種抓包解決方案

如果使用Flutter寫的APP不手動(dòng)設(shè)置代理,則可以使用另一種方案來抓包。

通過電腦設(shè)置熱點(diǎn) -> 使用手機(jī)連接電腦熱點(diǎn)上網(wǎng) -> 在電腦上使用Wireshark抓數(shù)據(jù)包。

具體步驟如下(macOS系統(tǒng)下):

1. 打開系統(tǒng)偏好設(shè)置,找到“共享”

Flutter,http請(qǐng)求,抓包

2. 打開“共享”,顯示以下窗口,并選擇共享以下來源的連接為指定的有線網(wǎng)絡(luò),用以下端口共享給電腦選擇為Wi-Fi

Flutter,http請(qǐng)求,抓包

3. 點(diǎn)擊右下角Wi-Fi選項(xiàng)按鈕,顯示如下,填寫對(duì)應(yīng)信息后點(diǎn)擊“好”保存

Flutter,http請(qǐng)求,抓包

4. 回到剛才的“共享”窗口,打開左側(cè)窗口中的服務(wù)“互聯(lián)網(wǎng)共享”

Flutter,http請(qǐng)求,抓包

5. 然后打開Wireshark軟件界面,首頁選擇對(duì)應(yīng)開熱點(diǎn)的網(wǎng)絡(luò)雙擊

Flutter,http請(qǐng)求,抓包

6. 請(qǐng)求接口域名t.weather.sojson.com對(duì)應(yīng)的IP為 58.222.18.24,則在上面輸入框中輸入請(qǐng)求過濾條件 "ip.dst == 58.222.18.24",然后通過手機(jī)APP發(fā)起網(wǎng)絡(luò)請(qǐng)求

查看接口的IP地址

$ ping t.weather.sojson.comPING nm.ctn.aicdn.com (58.222.18.24): 56 data bytes64 bytes from 58.222.18.24: icmp_seq=0 ttl=54 time=16.792 ms64 bytes from 58.222.18.24: icmp_seq=1 ttl=54 time=16.926 ms64 bytes from 58.222.18.24: icmp_seq=2 ttl=54 time=15.804 ms

Flutter,http請(qǐng)求,抓包

7. 選擇對(duì)應(yīng)的http請(qǐng)求,箭頭指定行,右鍵點(diǎn)擊,選擇Follow->HTTP Stream選項(xiàng)

Flutter,http請(qǐng)求,抓包

8. 彈出具體網(wǎng)絡(luò)請(qǐng)求信息窗口如下

Flutter,http請(qǐng)求,抓包

寫在最后

本篇分享了兩種Flutter中http數(shù)據(jù)包的抓包解決方案,大家可以根據(jù)實(shí)際情況來選擇使用。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产一区二区三区四区二区| 欧美精品与人动性物交免费看| 精品一区二区三区视频在线播放| 日韩国产一区二| 色一情一欲一爱一乱| 精品产品国产在线不卡| 黑人与娇小精品av专区| 最新国产乱人伦偷精品免费网站| 深夜福利视频一区| 麻豆国产原创| av在线理伦电影| 97青娱国产盛宴精品视频| 国产精品久久久久久亚洲av| 激情视频网站在线观看| 久久―日本道色综合久久| 欧美13一14另类| 国内精品女同女同一区二区三区| 国内外免费激情视频| 日韩精品一二| 精品视频在线观看一区二区| 青青草国产免费一区二区下载| 少妇一级黄色片| 亚洲.国产.中文慕字在线| 性色一区二区| 不卡中文字幕在线| av一区在线播放| 国产自产视频一区二区三区| 日韩精品在线免费播放| 国产精品亚洲美女av网站| 亚洲第一色网| 欧美一级二级在线观看| 97超碰人人模人人爽人人看| 超碰人人人人人人| av无码精品一区二区三区| www中文在线| 精品麻豆剧传媒av国产九九九| 韩日欧美一区| 国产在线中文字幕| 黄色美女网站在线观看| 国产日韩欧美在线| 国产精品一区二区无码对白| 欧美视频一区二区三区…| www.91av视频.com| 久久久久久久久久久成人| 欧美国产欧美亚洲国产日韩mv天天看完整| 色一情一乱一伦| 国产精品欧美激情在线播放| 好男人www社区| 亚洲国产中文字幕在线| aaa免费在线观看| 十九岁完整版在线观看好看云免费| 精品日韩视频| 国产精品sss| 国产精品精品视频一区二区三区| 中国一区二区三区| 亚洲图片欧美一区| 川上优av中文字幕一区二区| 精品av在线播放| 在线视频欧美一区| 尤物国产在线观看| www.豆豆成人网.com| 亚洲成色777777在线观看影院| 999精品视频在线观看| 成人欧美一区二区三区黑人孕妇| 日本www在线播放| 日本在线高清| 色多多国产成人永久免费网站| 无码人妻av一区二区三区波多野| 国产羞羞视频| 欧美日韩 国产精品| 欧美tickling挠脚心丨vk| 日韩免费不卡视频| 亚洲av永久无码精品| 国产99久一区二区三区a片| 日日噜噜噜夜夜爽爽狠狠| 欧美三级韩国三级日本三斤| 亚洲第一页综合| 国产日韩欧美精品在线| 国产对白在线正在播放| 1024精品视频| 亚洲精品一区三区三区在线观看| 国产国语亲子伦亲子| 91精品国产综合久久精品app| 国产免费av国片精品草莓男男| 一区二区三区国产精品| 一级特黄特色的免费大片| 欧美一区二区三区电影| 色屁屁影院www国产高清麻豆| 国内精品伊人久久久久影院对白| 欧美日韩国产va另类| 国内精品中文字幕| 黄页网址在线观看| 黄色国产精品| 国产成人精品在线看| 日韩写真欧美这视频| av成人综合网| 成人在线免费看片| 97精品人妻一区二区三区蜜桃| 国产美女黄色| 国产精品sss在线观看av| 香蕉成人影院| 97成人在线| jjzzjjzzjjzz| 天天搞夜夜操| 精品少妇一区二区| 亚洲av成人无码久久精品老人| 欧美性感一区二区三区| 日本午夜精品| 被男同事摸的水好多| 亚洲女同精品视频| 中文字幕亚洲高清| 中文字幕一区综合| 国产一线二线三线在线观看| 日韩大片在线永久免费观看网站| 日韩黄色一级视频| 奇米777日韩| 亚洲在线免费观看视频| 亚洲免费久久| 欧美视频日韩视频| www.xxx国产| 国产精品久久久久久福利| 激情在线观看视频| 免费看黄资源大全高清| 韩国精品视频在线观看| 日韩欧美一区二区三区四区五区| 久久久国际精品| 欧美sm精品调教视频| 欧美网站大全在线观看| 91天堂在线观看| 免费成人蒂法网站| 日韩一区二区欧美| 精品人伦一区二区三区| 欧美女优在线观看| 人妻精品无码一区二区| 免费福利在线视频| 欧美在线视频免费播放| √新版天堂资源在线资源| 青青久久av北条麻妃海外网| 人妻互换免费中文字幕| 欧美熟妇激情一区二区三区| 高清国语自产拍免费视频国产| 亚洲三区四区| 手机看片久久| 懂色av一区二区三区免费观看| 国产精品手机在线播放| 婷婷色在线观看| 你懂的视频在线| 欧美黑人性受xxxx精品| 国产麻豆免费视频| 国产精品久久综合| 日本视频www色| 国产精品久久久久久久久免费高清| 成人免费淫片在线费观看| 亚洲国产精品久久久久婷蜜芽| 亚洲成人中文字幕在线| 日本vs亚洲vs韩国一区三区| 国产va亚洲va在线va| 97蜜桃久久| 三级影片在线看| 国产精品第8页| 成人午夜影视| 免费在线观看国产精品| 91中文在线观看| 99久久国产免费看| 天天干夜夜干| 男人天堂2017| 国产尤物视频在线观看| 精品一区久久久久久| 亚洲麻豆一区二区三区| chinese全程对白| 国产精品视频不卡| 国产成人自拍视频在线观看| 国产精品久久久一区二区三区| 国产一区二区视频免费| 国产日产久久高清欧美一区| 国产精品视频一区二区三区四蜜臂| 日韩一区二区精品| 欧美性suv| 黄色av网站免费| 久久久久久香蕉网| 三级亚洲高清视频| 午夜黄色在线观看| 91精品久久久久久久久99蜜臂| 国产成人毛毛毛片| 中文字幕一区二区中文字幕| 精品久久久久久久久国产字幕| 一区二区欧美久久| 日本成人免费| 日韩少妇与小伙激情| 欧美大片在线观看| 精品无线一线二线三线| 色婷婷综合缴情免费观看| 福利在线一区二区| 性欧美videos精品| 亚洲成a人片77777老司机| 老司机2019福利精品视频导航| 亚洲精品国产精品自产a区红杏吧| 日韩欧美国产综合在线一区二区三区| 欧美成人午夜做爰视频在线观看| 国产成人亚洲精品乱码在线观看| 欧美视频导航| 亚洲裸体视频| 国产视频精品视频| 尤物yw193can在线观看| aa国产成人| 欧美三级日韩三级国产三级| 黄色精品一区| 亚洲激情不卡| 亚洲熟女毛茸茸| 内衣办公室在线| 久一视频在线观看| 国产精品福利电影一区二区三区四区| 国产深夜视频在线观看| 在线电影欧美成精品| 亚洲制服在线观看| www.麻豆av.com| 欧美精品激情在线观看| 亚洲伊人伊色伊影伊综合网| 精品处破学生在线二十三| 日韩精品丝袜美腿| 亚洲高清av一区二区三区| 石原莉奈在线亚洲三区| 成视频免费观看在线看| 一区二区三区四区在线免费观看| 国产精品久久久久久免费播放| 久久九九久久九九| 久久精品第九区免费观看| 99久久久无码国产精品免费| 一区二区三区四区免费观看| a级女人18毛片| 国产精品第10页| 在线看av的网址| 国产欧美在线观看一区| 日本一区二区三区中文字幕| 天天视频天天爽| 国产美女在线播放| 午夜久久久久久久久久| 亚洲午夜成aⅴ人片| 久久男人av资源网站| 国产精品入口免费视| 成人亚洲一区二区| 99热在线网站| 久艹在线观看视频| 日韩综合久久| 任你操在线观看| 影音先锋电影在线观看| 国产精品一区二区婷婷| 手机在线视频一区| yy6080午夜| 成人做爰免费视频免费看| 国产精品国产亚洲精品| www.国产在线观看| 国精产品久拍自产在线网站| 国产不卡在线| 91在线成人| 黄色福利视频网站| 国产精品网站在线播放| 欧美精品第一页| 亚洲色无码播放| 高清美女视频一区| 亚洲超碰精品一区二区| 神马影院我不卡午夜| 欧美日韩一区二区区别是什么| 少妇高潮在线观看| 久久69成人| 在线观看无遮挡| 午夜免费福利在线观看| 成人国产精品日本在线| 久久精品五月| 欧美日韩国产观看视频| julia京香一区二区三区| 777精品久无码人妻蜜桃| 久久99精品久久久久久青青91| 欧美精选在线播放| 我不卡一区二区| 久久av高潮av| 91在线视频成人| 国产资源在线观看入口av| 直接在线观看的三级网址| 欧美激情免费在线| 在线视频你懂得一区二区三区| 一级做a爰片性色毛片视频| 久久精品久久精品国产大片| 国产综合色香蕉精品| 欧美影片第一页| dy888亚洲精品一区二区三区| 91成人在线| 粉嫩的18在线观看极品精品| 国产成人av在线| 欧美黑人性受xxxx精品| 最新av在线| 黄色高清视频在线观看| 999在线免费观看视频| 欧美大尺度激情区在线播放| 久久精品国产亚洲5555| 三级在线观看免费大全| 国产男女激情视频| 亚洲人一区二区| 欧美一区二区三区视频免费播放| 韩日欧美一区| 国产精品久久久久久久久久白浆| 国产98在线|日韩| 91久久久久久| 国产精品69久久久久水密桃| 9自拍视频在线观看| 成人国产精品一区二区网站| 国产伦精品一区二区免费| 麻豆视频官网| 青青草综合视频| 91传媒视频在线观看| 亚洲第一区中文99精品| 日本一区二区精品| 亚洲私人影吧| 岛国视频午夜一区免费在线观看| 韩国中文字幕在线| 深夜福利视频在线观看| 麻豆精品国产自产在线| 啊啊啊久久久| 亚洲国产欧美日本视频| 欧美黄色性生活| 麻豆传媒视频在线| 在线观看你懂得| www.激情| 在线观看三级视频| 深夜福利av| 在线免费电影观看| 国产精品极品美女在线观看| caopon在线免费视频|