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 并自行替换 fakeKeyfakeSecret(很遗憾我不能在这里给你)时,它运行良好,我得到了这个答案(使用适当的令牌代替:


  "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"
)

&lt;HASH_COMPILED_FROM_USERNAME_PASSWORD&gt; 与 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 &lt;MY_WEBSITE&gt; 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 对 cme​​ts 的充分解释!

【讨论】:

以上是关于curl 使用 POST 方法工作,但获取 API 返回错误 503的主要内容,如果未能解决你的问题,请参考以下文章

使用 CORS 到 API 网关的 AJAX POST 不起作用,但可以使用 CURL 进行 POST

使用 API PUT 请求上传文件

从 PHP Curl 获取 POST Zapier webhook 响应

无法通过 Android 发送 Firebase 通知,但可以通过 curl 工作

无法使用 wininet 获取 POST 请求响应

在php中分别使用curl的post提交数据的方法和get获取网页数据的方法