优步的API在CORS预检请求期间返回404
我试图在我的JavaScript客户端中使用Uber API。优步的API在CORS预检请求期间返回404
我知道这涉及到CORS,因为我的客户端将通过AJAX直接访问Uber API。
在优步开发人员仪表板中,我正确设置了自己的Origin URI。然后,我设定了我能找到的最简单的例子。在此之前,从尤伯杯的文档:
<!DOCTYPE html>
<html>
<head>
<title>Uber API Demo</title>
</head>
<body>
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.uber.com/v1.2/products?latitude=37.7759792&longitude=-122.41823');
xhr.setRequestHeader("Authorization", "Token <ServerToken>");
xhr.send();
</script>
</body>
</html>
综观Chrome开发工具的控制台,这是我所看到的:
而且,最有趣的,网络标签:
我的浏览器正在将我的HTTP POST更改为HTTP OPTIONS请求(部分CORS预检定义在第e获取规格),看起来Uber不支持。优步的服务器应该回复响应头,授权我的客户端完成其API请求。相反,他们正在返回一个404
总结:
- 尤伯杯的文件说,他们支持CORS。
- 我在Uber的开发人员仪表板中正确设置了我的Origin URI
- CORS规范说明如果我使用授权标头进行HTTP POST,这是一个非简单请求,并且需要HTTP OPTIONS预检。
- 我的浏览器正在做确切的是,使用包括起源头HTTP方法OPTIONS发送请求(其匹配的来源URI集合在我的乌伯开发人员信息中心。)
- 乌伯被返回状态404(未找到)
任何人都知道这里发生了什么?
当发出请求尤伯杯从前端的JavaScript在浏览器中运行,而不是增加一个Authorization
头的请求的代码,API端点,你需要一个access_token
查询参数添加到请求的URL,就像这样:
https://api.uber.com/v1.2/products?access_token=<TOKEN>&latitude=XXX&longitude=XXX
见https://developer.uber.com/docs/trip-experiences/guides/authentication#use-bearer-token
尤伯杯的文件说,他们支持CORS
是的,这个文档在提出这个声明时并不完全准确。
我的浏览器正在改变我的HTTP POST到HTTP OPTIONS请求......
为了更精确:浏览器不改变POST
为OPTIONS
;而不是POST
请求之前,浏览器做OPTIONS
请求。浏览器这样做的原因是因为您的代码在请求中添加了一个Authorization
标头。
,它看起来像尤伯杯(在取预检规范中定义的CORS的部分)不支持
权。这就是Uber API文档中他们支持CORS的说法并不完全准确。他们实际上并不完全支持CORS;特别是,它们的API端点根本不支持处理CORS预检OPTIONS
请求。
然后将一个Authorization
标头添加到前端运行在浏览器中的JavaScript请求中,导致浏览器执行预检OPTIONS
请求。
因此,由于Uber API端点不支持该功能,因此您无法使用Authorization
请求标头向前端JavaScript代码向Uber API端点发出请求以提供凭据。您需要将access_token
查询参数添加到请求URL。
当所有其他操作失败时,在您控制的服务器上设置代理 – charlietfl