You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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实际发送的所有请求头,看看自己的代码里还缺了什么:

  1. curl -v命令查看完整的请求头:curl -v -X GET "https://openbanking.api.rabobank.com.au/public/cds-au/v1/banking/products" -H "x-v: 3",输出里会显示curl发送的所有请求头
  2. 或者在Postman里,点击右上角的「代码生成器」(Code)按钮,直接生成对应Python/JS的请求代码,对比自己写的代码,就能快速找出差异的请求头了

内容来源于stack exchange

火山引擎 最新活动