Flutter中HTTP Post请求空格转+而非%2B的实现问题
Flutter Post请求中保留+字符(替代空格)的解决方案
要让请求体里的空格直接以+形式发送,而非被编码为%2B,核心是绕过http包的自动编码逻辑,直接构造原始请求体字符串。
具体实现代码
import 'package:http/http.dart' as http; Future<void> sendSearchRequest() async { // 用户输入的内容 final userInput = "hello world"; // 手动将空格替换为+ final encodedInput = userInput.replaceAll(' ', '+'); // 构造符合要求的请求体 final requestBody = 'searchword=$encodedInput'; try { final response = await http.post( Uri.parse('https://www.example.com/XXXX/XXXX/XXXX'), headers: { 'Content-Type': 'application/x-www-form-urlencoded', // 根据需求添加其他请求头,比如User-Agent、Accept等 }, body: requestBody, // 直接传递原始字符串,不触发自动编码 ); // 处理响应 if (response.statusCode == 200) { print("请求成功:${response.body}"); } else { print("请求失败,状态码:${response.statusCode}"); } } catch (e) { print("请求出错:$e"); } }
原理说明
Flutter的http.post方法,如果传入的body是Map类型,会自动调用Uri.encodeQueryComponent对参数进行编码——这个方法会把空格转为%20,同时把+转为%2B,导致你手动替换的+被二次编码。
而直接传入String类型的body时,http包会原样发送内容,不会做任何编码处理,这样就能保证hello+world直接出现在请求体中,符合目标服务器的要求。
内容的提问来源于stack exchange,提问作者pycode80
相关产品推荐
相关产品推荐

