curl 使用 POST 方法工作,但获取 API 返回错误 503
Posted
技术标签:
【中文标题】curl 使用 POST 方法工作,但获取 API 返回错误 503【英文标题】:curl with POST method working, but fetch API return error 503 【发布时间】:2018-11-04 11:17:09 【问题描述】:我必须访问一个私有 API(法航航空公司的 API 之一),为了使用他们的任何 API,我需要一个访问令牌。 所以in their guide,他们说我们需要使用这个 cURL 来获取令牌:
$ curl https://www.klm.com/oauthcust/oauth/token -d 'grant_type=client_credentials' -u fakeKey:fakeSecret
终端
当我在终端中执行此 cURL 并自行替换 fakeKey
和 fakeSecret
(很遗憾我不能在这里给你)时,它运行良好,我得到了这个答案(使用适当的令牌代替:
"access_token": <TOKEN>,
"token_type":"bearer",
"expires_in":3600
邮递员
当我在 Postman 中执行此操作时,我填写的内容如下:
网址: 发布:https://www.klm.com/oauthcust/oauth/token 授权: 类型:基本身份验证 用户名:我的秘密用户名 密码:我的密码 标题: 授权:根据我的用户名和密码自动生成 内容类型:application/x-www-form-urlencoded 身体 已检查 x-www-form-urlencoded grant_type:client_credentials就是这样,当我点击SEND
时,我得到了答案和令牌。
FETCH / AXios / HTTPRequest
因此,由于我在获取数据方面还不是很好,所以我使用 https://kigiri.github.io/fetch/ 将我的 cURL 转换为 fetch
JS 方法。它返回我这个代码:
fetch("https://www.klm.com/oauthcust/oauth/token",
body: "grant_type=client_credentials",
headers:
Authorization: "Basic <HASH_COMPILED_FROM_USERNAME_PASSWORD>",
"Content-Type": "application/x-www-form-urlencoded"
,
method: "POST"
)
<HASH_COMPILED_FROM_USERNAME_PASSWORD>
与 Postman 编译的完全相同。
所以这个提取对我来说似乎没问题,但是在 Chrome 上它返回一个 Response for preflight has invalid HTTP status code 503.
Opera 正在回复我Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin <MY_WEBSITE> is therefore not allowed access. The response had HTTP status code 503.
但是错误来自他们的网站似乎很奇怪,我认为这更多是我在获取请求中遗漏的东西。你有什么想法吗?
谢谢!
【问题讨论】:
尝试使用curl -i -X OPTIONS https://www.klm.com/oauthcust/oauth/token -d 'grant_type=client_credentials' -u fakeKey:fakeSecret
,即使来自curl
,您也会得到相同的503响应。原因是:您在请求中添加了一个 Authorization 标头,这会触发您的浏览器自动向该服务器发送 CORS preflight OPTIONS 请求,然后再尝试来自您的代码的 POST 请求。并且该预检失败 - 因为对该 OPTIONS 请求的响应状态是 503 而不是 200 OK。见developer.mozilla.org/en-US/docs/Web/HTTP/CORS
所以它的要点是:您能够从前端 javascript 代码成功使用 klm.com/oauthcust/oauth/token 端点的唯一方法是,如果该服务器的维护者修复它,使其不会t 使用 503 响应 OPTIONS 请求。或者,如果该服务器提供了一种无需发送 Authorization 标头即可进行身份验证的方法——例如,允许您将凭据作为参数包含在该 POST 的正文中——然后您的请求不会触发浏览器执行预检 OPTIONS 请求。
参数的键是怎样的? username
& password
?
我不知道参数是什么,也不知道它们是否真的支持该 API 上的任何此类参数。我想您需要联系 API 所有者并找出答案。但是,是的,503 是因为该服务器上的服务器设置。因此,除非他们提供其他一些身份验证机制,否则无法更改您的请求以防止出现 503。
太好了,感谢您的解释。我还阅读了html5rocks.com/en/tutorials/cors 以了解更多正在发生的事情。
【参考方案1】:
好吧,答案最终是:请求必须来自后端,否则响应中将没有任何内容(或错误 503)。感谢 @sideshowbarker 对 cmets 的充分解释!
【讨论】:
以上是关于curl 使用 POST 方法工作,但获取 API 返回错误 503的主要内容,如果未能解决你的问题,请参考以下文章
使用 CORS 到 API 网关的 AJAX POST 不起作用,但可以使用 CURL 进行 POST
从 PHP Curl 获取 POST Zapier webhook 响应