Flutter配置代理抓包實(shí)現(xiàn)過程詳解
背景
在開發(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ì)?)。于是我就嘗試通過抓包來查看請(qǐng)求
工具準(zhǔn)備
- 安裝charles
- 有時(shí)我們需要抓https的請(qǐng)求,此時(shí)用charles抓包的內(nèi)容是加密的,看不到明文,這時(shí)候需要安裝下Charles的證書來解決。點(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)求庫的配置里設(shè)置代理,另一種是利用Flutter原生的類來完成
方式一、http請(qǐng)求庫配置代理
dio配置代理
flutter項(xiàng)目里通常用dio庫做http請(qǐng)求,我們可以通過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ù)用來返回我們的代理接口,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í)沒有通過,導(dǎo)致抓包錯(cuò)誤。所以我們直接通過client.badCertificateCallback函數(shù)返回true來忽略證書就好了。
web_socket_channel配置代理
有了上面dio的配置后,還不夠,因?yàn)槲覀兊?code>websocket請(qǐng)求還是無法抓包。如果你項(xiàng)目中需要抓取websocket,可以使用web_socket_channel這個(gè)庫。需要注意的是這個(gè)庫不能從官網(wǎng)拉取,因?yàn)楣俜降?code>web_socket_channel的還不支持代理,我在官方的代碼倉庫看到有幾個(gè)與支持代理相關(guān)的pr請(qǐng)求,但是官方都還沒有進(jìn)行合并分支,所以我就自己fork倉庫修改了一下,我們可以改成以下方式進(jìn)行安裝:
dependencies:
web_socket_channel:
git:
url: https://github.com/IFreeOvO/web_socket_channel.git
ref: master
然后我們開始配置web_socket_channel,不過有了之前配置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)求庫限制,配置完后https和websocket都能正確抓包。效果如圖:

以上就是Flutter配置代理抓包實(shí)現(xiàn)過程詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter配置抓包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android仿微信底部菜單欄功能顯示未讀消息數(shù)量
這篇文章主要介紹了Android仿微信底部菜單欄功能,并顯示未讀消息數(shù)量,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Android開發(fā)之使用SQLite存儲(chǔ)數(shù)據(jù)的方法分析
這篇文章主要介紹了Android開發(fā)之使用SQLite存儲(chǔ)數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android使用SQLite數(shù)據(jù)庫實(shí)現(xiàn)針對(duì)數(shù)據(jù)的增刪改查操作相關(guān)技巧,需要的朋友可以參考下2017-07-07
Android開發(fā)實(shí)現(xiàn)圖片大小與質(zhì)量壓縮及保存
這篇文章主要為大家介紹了Android開發(fā)實(shí)現(xiàn)圖片大小與質(zhì)量壓縮及保存的方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Android開發(fā)筆記之:Splash的實(shí)現(xiàn)詳解
本篇文章是對(duì)Android中Splash的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
利用Android中的TextView實(shí)現(xiàn)逐字顯示動(dòng)畫
在安卓程序啟動(dòng)的時(shí)候,想逐字顯示一段話,每個(gè)字都有一個(gè)從透明到不透明的漸變動(dòng)畫。那如何顯示這個(gè)效果,下面一起來看看。2016-08-08
kotlin中object關(guān)鍵字的三種使用場(chǎng)景
這篇文章主要給大家介紹了關(guān)于kotlin中object關(guān)鍵字的三種使用場(chǎng)景,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用kotlin具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Android開發(fā)之ProgressDialog進(jìn)度對(duì)話框用法示例
這篇文章主要介紹了Android開發(fā)之ProgressDialog進(jìn)度對(duì)話框用法,簡(jiǎn)單介紹了ProgressDialog進(jìn)度對(duì)話框常見函數(shù)功能,并結(jié)合實(shí)例形式分析了ProgressDialog組件創(chuàng)建及使用進(jìn)度對(duì)話框相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
詳解Android WebView監(jiān)聽console錯(cuò)誤信息
這篇文章主要介紹了Android WebView監(jiān)聽console錯(cuò)誤信息,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
ListView的Adapter使用 之 初學(xué)ArrayAdapter String
ListView是Android中經(jīng)常會(huì)使用的東西,綁定數(shù)據(jù)對(duì)于初學(xué)者來說,尤其是剛接觸編程的人來說,往往會(huì)覺得很難理解,我上大二的時(shí)候?qū)W的java,但是基本上相當(dāng)于沒有學(xué),什么都沒寫過,真正接觸編程就是開始上手學(xué)android,把這些記錄下來,自己可以回頭看下,也可以讓新手更好的理解2013-06-06

