Flutter中如何在HTTP请求中传递Cookie?
问题
我想要访问Instagram私有API,该API要求用户登录后才能发送请求。为此,我借助flutter_web_view和webview_cookie_manager获取Cookie或会话ID(即让用户通过WebView登录,再使用cookie_manager包获取Cookie)。但不知道如何将这些Cookie传入HTTP请求中?
// 获取cookie或会话ID WebViewController webViewController = WebViewController() ..loadRequest(Uri.parse('https://www.instagram.com/')) ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setNavigationDelegate( NavigationDelegate( onPageFinished: (value) async { final cookieManager = WebviewCookieManager(); List<Cookie> gotCookies = await cookieManager.getCookies('https://www.instagram.com/'); print(gotCookies); // 已获取到cookies } ) ); var response = await http.get(private_api_url); // 如何在此请求中传入cookies
解决方案
要把获取到的Cookie传入HTTP请求,只需两步操作:
- 转换Cookie格式:将
List<Cookie>转换成HTTP标准的Cookie字符串——把每个Cookie的name和value拼接成name=value,多个Cookie用;分隔。 - 添加到请求头:在
http.get的headers参数中加入Cookie字段,值为转换后的字符串。
修改后的完整代码示例:
// 获取cookie或会话ID WebViewController webViewController = WebViewController() ..loadRequest(Uri.parse('https://www.instagram.com/')) ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setNavigationDelegate( NavigationDelegate( onPageFinished: (value) async { final cookieManager = WebviewCookieManager(); List<Cookie> gotCookies = await cookieManager.getCookies('https://www.instagram.com/'); // 转换Cookie为HTTP请求所需格式 String cookieString = gotCookies.map((cookie) => '${cookie.name}=${cookie.value}').join('; '); // 携带Cookie发送私有API请求 var response = await http.get( Uri.parse(private_api_url), headers: { 'Cookie': cookieString, // 建议保留和WebView一致的User-Agent,避免被服务端拦截 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } ); print(response.body); } ) );
额外注意
- 确保私有API的域名在Cookie的
domain允许范围内,否则服务端会忽略这些Cookie。 - 无需手动处理
HttpOnly标记的Cookie,webview_cookie_manager已自动包含这类Cookie,直接拼接即可。
内容的提问来源于stack exchange,提问作者shakti goyal
相关产品推荐
相关产品推荐

