curl 接口测试中文参数乱码问题排查与思考¶
1 问题现象¶
使用http get方法进行接口测试,没有返回任何数据。
2 排查过程¶
2.1 切换http post方式,正常返回json格式数据,服务器端接口服务正常;
返回json数据略。
2.2 开启详细模式
发现请求行中中文已变成乱码:

2.3 尝试切换cmd编码
仍然失败,请求中仍是乱码。
2.4 对比测试:使用 httpbing.org 测试
C:\Users\Administrator>curl "https://httpbin.org/get?city=深圳"
{
"args": {
"city": "\u6df1\u5733"
},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/8.9.1",
"X-Amzn-Trace-Id": "Root=1-69e788c8-739b25c636023a9d55ee1321"
},
"origin": "112.97.81.128",
"url": "https://httpbin.org/get?city=\u6df1\u5733"
}
竟然成功了,看'city'参数值可见 httpbin.org 已自动对中文字符进行了转码。
2.5 结论推导
bugpk.com 接口服务器收到原始UTF-8字符 "city=深圳" 进行验证校验,结果因乱码而 400 Bad Request 失败;
httpbin.org 测试服务器同样接收到UTF-8格式的字符串 "city=深圳" 会主动解码,然后返回 200 成功。
经过对比测试和结论推导,可知问题不在curl,而在于 不同接口服务器对URL标准的实现严格程度不同。
3 解决方案¶
使用 --data-urlencode 选项在curl发起http get请求前主动进行URL编码。
4 总结思考¶
curl不会自动对URL中的中文字符进行编码,使用get方式且参数或参数值包含中文字符时极可能出现乱码问题。我们不能指望服务器提供兼容容错能力,在本地发送端保证数据符合标准才是更为严谨的做法。