CURL转Axios请求失败返回空数组,求问题原因及解决办法
问题排查:CURL转Axios后返回空数组的解决方法
我帮你排查了一下,你的Axios请求有几个关键问题导致返回空数组,咱们逐个解决:
1. 语法错误:.then()回调写法有误
你的Axios代码里.then(response){ ... }缺少了括号,正确的回调写法应该是带括号的箭头函数或者普通函数,这个语法错误会直接导致请求无法正常执行,甚至静默报错。
2. 缺失压缩相关配置,对应curl的--compressed参数
curl的--compressed参数会告知服务器可以返回gzip/deflate压缩后的响应,Axios默认不会自动携带对应的请求头,也不会自动解压响应,这可能导致服务器返回的内容无法被正确解析,最终得到空数组。
3. 未正确读取响应体
Axios会把服务器返回的响应体放在response.data属性里,而你直接打印整个response对象,可能会忽略真正的返回数据。
修正后的完整Axios代码
axios({ method: 'POST', url: 'https://reiseauskunft.bahn.de/bin/mgate.exe?checksum=6d6fa2fac99949c118a40baf411875a0', headers: { 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; SM-G900F Build/MMB29M)', 'Content-Type': 'application/json;charset=UTF-8', 'Host': 'reiseauskunft.bahn.de', 'Accept-Encoding': 'gzip, deflate, br' // 对应curl的--compressed参数 }, data: { "auth":{"aid":"n91dB8Z77MLdoR0K","type":"AID"}, "client":{"id":"DB","name":"DB Navigator","os":"Android 6.0.1","res":"1080x1920","type":"AND","ua":"Dalvik/2.1.0 (Linux; U; Android 6.0.1; SM-G900F Build/MMB29M)","v":18040000}, "ext":"DB.R18.04.a", "formatted":false, "svcReqL":[{"cfg":{"polyEnc":"GPA","rtMode":"HYBRID"},"meth":"TripSearch","req":{"outDate":"20180531","outTime":"204603","arrLocL":[{"crd":{"x":9684169,"y":50554794},"extId":"8000115","lid":"A=1@O=Fulda@X=9683980@Y=50554722@U=80@L=008000115@B=1@p=1525745008@","name":"Fulda","type":"S"}],"depLocL":[{"crd":{"x":13386988,"y":52520501},"extId":"8096003","lid":"A=1@O=BERLIN@X=13386988@Y=52520501@U=80@L=008096003@B=1@p=1526433964@","name":"BERLIN","type":"S"}],"getPasslist":true,"getPolyline":true,"jnyFltrL":[{"mode":"BIT","type":"PROD","value":"11111111111111"}],"trfReq":{"cType":"PK","jnyCl":2,"tvlrProf":[{"type":"E"}]}}]}], "ver":"1.15" }, decompress: true, // 开启自动解压响应 responseType: 'json' // 明确指定响应格式为JSON }) .then((response) => { console.log('===========response========================='); console.log(response.data); // 读取真正的响应体数据 console.log('===================================='); }) .catch((error) => { // 一定要添加错误捕获,才能看到请求失败的具体原因 console.error('请求出错:', error); if (error.response) { console.error('响应状态码:', error.response.status); console.error('错误响应数据:', error.response.data); } });
额外排查建议
- 检查跨域问题:如果是在浏览器环境下发起请求,需要确认目标服务器是否允许跨域,本地开发时可以配置代理绕过跨域限制。
- 核对
checksum有效性:这个参数可能是请求体的签名值,若请求体有任何细微改动(比如空格、键顺序)都可能导致签名失效,返回空结果,建议和原始curl的请求体完全一致。 - 对比请求差异:用浏览器Network面板查看实际发送的请求头、请求体,和原始curl的请求做对比,任何差异都可能是问题所在。
内容的提问来源于stack exchange,提问作者otto
相关产品推荐
相关产品推荐

