Flutter配置代理抓包實(shí)現(xiàn)過(guò)程詳解
背景
在開發(fā)Flutter中,我們經(jīng)常需要對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行調(diào)試,而Flutter自帶的devtool的network又不太好用,有時(shí)會(huì)出現(xiàn)請(qǐng)求成功,但是又看不到response返回(難道是我姿勢(shì)不對(duì)?)。于是我就嘗試通過(guò)抓包來(lái)查看請(qǐng)求
工具準(zhǔn)備
- 安裝charles
- 有時(shí)我們需要抓https的請(qǐng)求,此時(shí)用charles抓包的內(nèi)容是加密的,看不到明文,這時(shí)候需要安裝下Charles的證書來(lái)解決。點(diǎn)擊
help > SSL Proxying > Install Charles Root Certificate
,安裝到系統(tǒng)的鑰匙串中。(這里借下了光哥小冊(cè)里的截圖)
點(diǎn)擊證書,將信任選項(xiàng)改成始終信任
開啟charles的代理。開啟后,確認(rèn)Proxy
選項(xiàng)卡與下方畫紅線的地方顯示一樣
配置Flutter代理
完成工具準(zhǔn)備后,由于Flutter默認(rèn)不走系統(tǒng)代理,所以我們還需要手動(dòng)在Flutter
項(xiàng)目中配置代理,charles
才能正確抓到包。這里提供兩種方案,一種是在請(qǐng)求庫(kù)的配置里設(shè)置代理,另一種是利用Flutter
原生的類來(lái)完成
方式一、http請(qǐng)求庫(kù)配置代理
dio
配置代理
flutter項(xiàng)目里通常用dio
庫(kù)做http請(qǐng)求,我們可以通過(guò)dio的httpClientAdapter
屬性配置我們的本地代理。代碼如下:
import 'package:dio/dio.dart'; var dio = Dio(); (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { client.findProxy = (uri) { return 'PROXY localhost:8888'; }; client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; //忽略證書 };
其中client.findProxy
函數(shù)用來(lái)返回我們的代理接口,charles的默認(rèn)的系統(tǒng)代理端口是8888
,所以這里配置成
PROXY localhost:8888
就可以了。下面一句client.badCertificateCallback
函數(shù)也很關(guān)鍵,如果不進(jìn)行配置,charles在抓包https請(qǐng)求時(shí)會(huì)出現(xiàn)下圖錯(cuò)誤:
這個(gè)錯(cuò)誤產(chǎn)生的原因,經(jīng)我查閱網(wǎng)上資料是因?yàn)镕lutter請(qǐng)求https時(shí)用的是自己的CA認(rèn)證證書,所以charles在認(rèn)證證書時(shí)沒有通過(guò),導(dǎo)致抓包錯(cuò)誤。所以我們直接通過(guò)client.badCertificateCallback
函數(shù)返回true
來(lái)忽略證書就好了。
web_socket_channel配置代理
有了上面dio
的配置后,還不夠,因?yàn)槲覀兊?code>websocket請(qǐng)求還是無(wú)法抓包。如果你項(xiàng)目中需要抓取websocket
,可以使用web_socket_channel
這個(gè)庫(kù)。需要注意的是這個(gè)庫(kù)不能從官網(wǎng)拉取,因?yàn)楣俜降?code>web_socket_channel的還不支持代理,我在官方的代碼倉(cāng)庫(kù)看到有幾個(gè)與支持代理相關(guān)的pr請(qǐng)求,但是官方都還沒有進(jìn)行合并分支,所以我就自己fork倉(cāng)庫(kù)修改了一下,我們可以改成以下方式進(jìn)行安裝:
dependencies: web_socket_channel: git: url: https://github.com/IFreeOvO/web_socket_channel.git ref: master
然后我們開始配置web_socket_channel
,不過(guò)有了之前配置dio
的經(jīng)驗(yàn)后,我們配置web_socket_channel
也是使用了差不多的思路,代碼如下:
import 'package:web_socket_channel/io.dart'; // 創(chuàng)建一個(gè)自己的HttpClient對(duì)象 SecurityContext ctx = SecurityContext.defaultContext; HttpClient client = HttpClient(context: ctx) ..findProxy = ((uri) { return 'PROXY localhost:8888'; }) ..badCertificateCallback = (cert, host, port) { return true; }; _channel = IOWebSocketChannel.connect( 'wss://xxx.com', customClient: client, // 使用定制的HttpClient );
方式二、重寫原生方法
在入口文件main.dart
里定義一個(gè)HttpOverrides
的子類,重寫它的createHttpClient
方法。原理也是一樣的,把findProxy
和badCertificateCallback
方法進(jìn)行替換。然后掛載到全局。
// 重寫HttpOverrides class MyHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { var http = super.createHttpClient(context); http.findProxy = (uri) { return 'PROXY localhost:8888'; }; http.badCertificateCallback = (X509Certificate cert, String host, int port) => true; return http; } } void main() { HttpOverrides.global = MyHttpOverrides(); // 使用自己的HttpOverrides類 runApp(MyApp()); }
這種方案的好處是不受第三方請(qǐng)求庫(kù)限制,配置完后https
和websocket
都能正確抓包。效果如圖:
以上就是Flutter配置代理抓包實(shí)現(xiàn)過(guò)程詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter配置抓包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android Studio使用教程(五):Gradle命令詳解和導(dǎo)入第三方包
這篇文章主要介紹了Android Studio使用教程(五):Gradle命令詳解和導(dǎo)入第三方包,本文講解了導(dǎo)入Android Studio、Gradle常用命令等內(nèi)容,需要的朋友可以參考下2015-05-05安卓(android)怎么實(shí)現(xiàn)下拉刷新
這里我們將采取的方案是使用組合View的方式,先自定義一個(gè)布局繼承自LinearLayout,然后在這個(gè)布局中加入下拉頭和ListView這兩個(gè)子元素,并讓這兩個(gè)子元素縱向排列。對(duì)安卓(android)怎么實(shí)現(xiàn)下拉刷新的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-04-04android 點(diǎn)擊EditText始終不彈出軟件鍵盤實(shí)現(xiàn)代碼
這篇文章主要介紹了android 點(diǎn)擊EditText始終不彈出軟件鍵盤實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11關(guān)于Android?Webview?設(shè)置Cookie問(wèn)題詳解
大家好,本篇文章是關(guān)于Android?Webview?設(shè)置Cookie問(wèn)題詳解,感興趣的同學(xué)可以看看,希望對(duì)你起到幫助,有用的話記得收藏,方便下次瀏覽2021-11-11Ionic2創(chuàng)建App啟動(dòng)頁(yè)左右滑動(dòng)歡迎界面
使用Ionic2創(chuàng)建應(yīng)用非常簡(jiǎn)單,只需在V1的命令后跟上--v2即可.這篇文章主要介紹了Ionic2創(chuàng)建App啟動(dòng)頁(yè)左右滑動(dòng)歡迎界面的相關(guān)資料,需要的朋友可以參考下2016-10-10Android 通過(guò)代碼設(shè)置、打開wifi熱點(diǎn)及熱點(diǎn)連接的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 通過(guò)代碼設(shè)置、打開wifi熱點(diǎn)及熱點(diǎn)連接的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05Android 解決WebView無(wú)法上傳文件的問(wèn)題
這篇文章主要介紹了Android 解決WebView無(wú)法上傳文件的問(wèn)題的相關(guān)資料,需要的朋友可以參考下2017-07-07Android實(shí)現(xiàn)歌曲播放時(shí)歌詞同步顯示具體思路
歌曲播放時(shí)歌詞同步顯示,我們需要讀取以上歌詞文件的每一行轉(zhuǎn)換成成一個(gè)個(gè)歌詞實(shí)體,可根據(jù)當(dāng)前播放器的播放進(jìn)度與每句歌詞的開始時(shí)間,得到當(dāng)前屏幕中央高亮顯示的那句歌詞2013-06-06