跳转至

curl 接口测试中文参数乱码问题排查与思考

1 问题现象

curl "https://api.bugpk.com/api/weather?city=深圳"

使用http get方法进行接口测试,没有返回任何数据。

2 排查过程

2.1 切换http post方式,正常返回json格式数据,服务器端接口服务正常;

curl -d "city=深圳" "https://api.bugpk.com/api/weather"

返回json数据略。

2.2 开启详细模式

curl -v "https://api.bugpk.com/api/weather?city=深圳"

发现请求行中中文已变成乱码:

> GET /api/weather?city=娣卞湷 HTTP/1.1

2.3 尝试切换cmd编码

chcp 65001  # 切换到 UTF-8

仍然失败,请求中仍是乱码。

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编码。

curl -G "https://api.bugpk.com/api/weather" --data-urlencode "city=深圳"

4 总结思考

curl不会自动对URL中的中文字符进行编码,使用get方式且参数或参数值包含中文字符时极可能出现乱码问题。我们不能指望服务器提供兼容容错能力,在本地发送端保证数据符合标准才是更为严谨的做法。