如何使用Dio发送FormData?提交后网站返回错误该如何排查?
你当前的代码存在多处明显错误,表单编写不符合业务场景要求:
1. 请求类型与Content-Type配置完全错误
你对接的是ASP.NET的异步回发接口,参数提交格式要求为application/x-www-form-urlencoded,而你做了两处错误配置:
- 错误使用
FormData封装参数,FormData仅用于multipart/form-data格式的请求(如传文件场景) - 强制设置Content-Type为
text/html; charset=utf-8,还额外添加了无效的application: x-www-form-urlencoded请求头,格式完全不符合后端要求
2. 动态参数写死失效
代码里的__VIEWSTATE是ASP.NET的页面状态校验参数,每次访问页面都会动态刷新,你直接写死固定值会被后端校验直接拦截。
3. 空键参数不匹配
你代码里设置的空键是单个空格" ",需要和浏览器实际请求的空键完全一致,如果浏览器里是完全空的字符串"",就需要把键改为空字符串,否则参数会不匹配。
4. 请求头重复冲突
你在拦截器和post请求的Options中重复设置了Content-Type,会导致参数解析异常。
修正后的参考代码:
// 1. 先请求目标页面,提取最新的__VIEWSTATE等动态参数(这里省略爬取逻辑,你需要自行实现提取最新值) String latestViewState = "你从页面最新爬取到的__VIEWSTATE值"; // 2. 直接用Map封装参数,不要用FormData var params = { "ctl00\$ScriptManager1": "ctl00\$UpdatePanel1", "__EVENTTARGET": "ctl00\$cphPage\$productsControl", "__EVENTARGUMENT": "", "__LASTFOCUS": "", "PageLoadedHiddenTxtBox": "Set", "Language": "es-MX", "CurrentLanguage": "es-MX", "Currency": "", "__VIEWSTATE": latestViewState, "__VIEWSTATEGENERATOR": "C0E71A90", "ctl00\$txtSearch": "", "ctl00\$cphPage\$productsControl\$TopTools\$cbxSortType": "", "ctl00\$cphPage\$productsControl\$TopTools\$cbxPageSize": "-1", "ctl00\$taxes\$listCountries": "54", "__ASYNCPOST": "true", // 这里根据浏览器实际的键调整,是空字符串就写"",是空格就写" " "": "" }; var dio = Dio(); dio.interceptors.add(InterceptorsWrapper(onRequest: (RequestOptions options) async { var customHeaders = { 'Cookie': 'uid=rBQBc2CisZdxWU5XBBmMAg==; ASP.NET_SessionId=tedc4xrih1hk1ykbdzlakuvb; ASPNET_Session=client=BLUR; ShopMSAuth=0102A9A3B88FC919D908FEA90B7DF1D119D908000442004C005500520000012F00FF' }; options.headers.addAll(customHeaders); return options; })); // 3. 发送请求时指定contentType为form-urlencoded Response response = await dio.post( url, data: params, options: Options( contentType: Headers.formUrlEncodedContentType, followRedirects: true ) ); print(response.data);
内容的提问来源于stack exchange,提问作者Ernesto Enrique Sanchez
相关产品推荐
相关产品推荐

