Curl与Postman调用API正常,但JS Fetch及Python Requests调用返回403 Forbidden求助
Curl与Postman调用API正常,但JS Fetch及Python Requests调用返回403 Forbidden求助
看起来你碰到了个挺闹心的问题——明明用curl和Postman调用这个API都顺顺当当的,换成Python Requests或者JS Fetch写代码就直接返回403 Forbidden了,我来帮你捋捋可能的原因和解决办法。
最可能的问题:缺少合法的User-Agent请求头
很多API服务器会对请求的User-Agent字段做校验,用来识别请求的客户端类型,防止一些非标准的请求或者爬虫请求。
- curl和Postman在发送请求时,会自动带上符合服务器预期的
User-Agent头(比如curl的默认User-Agent是类似curl/7.81.0,Postman会带PostmanRuntime/7.32.3这类) - 但Python Requests和JS Fetch的默认
User-Agent要么太简单(比如Python Requests默认是python-requests/2.31.0),要么在某些环境下会被省略,直接触发了服务器的拦截机制,返回403。
给你修改后的可运行代码
Python版本(加上User-Agent头)
import requests BASE_URL = "https://openbanking.api.rabobank.com.au/public/cds-au/v1/banking/products" HEADERS = { "x-v": "3", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } resp = requests.get(BASE_URL, headers=HEADERS) resp.raise_for_status() # 可以用来抛出异常,方便调试 print(resp.json())
JavaScript版本(加上User-Agent头)
const response = await fetch("https://openbanking.api.rabobank.com.au/public/cds-au/v1/banking/products", { headers: { "x-v": "3", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } }); const data = await response.json(); console.log(data);
额外调试小技巧
如果加了User-Agent还是不行,你可以对比下curl和Postman实际发送的所有请求头,看看自己的代码里还缺了什么:
- 用
curl -v命令查看完整的请求头:curl -v -X GET "https://openbanking.api.rabobank.com.au/public/cds-au/v1/banking/products" -H "x-v: 3",输出里会显示curl发送的所有请求头 - 或者在Postman里,点击右上角的「代码生成器」(Code)按钮,直接生成对应Python/JS的请求代码,对比自己写的代码,就能快速找出差异的请求头了
内容来源于stack exchange




