我正在尝试在我的JavaScript客户端中使用Uber API。
我知道这涉及到CORS,因为我的客户端将通过AJAX直接访问Uber API。
在Uber Developers Dashboard中,我正确设置了我的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请求(在fetch规范中定义的CORS预检的一部分),它看起来像Uber不支持。 Uber的服务器应该回复响应头,授权我的客户端完成其API请求。相反,他们正在返回404。
总结:
任何人都知道这里发生了什么?
答案 0 :(得分:1)
当从浏览器中运行的前端JavaScript代码向Uber API端点发出请求时,您需要向请求URL添加Authorization
查询参数,而不是向请求添加access_token
标头,像这样:
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
;而是在尝试OPTIONS
请求之前,浏览器正在执行POST
请求。浏览器之所以这样做是因为您的代码会在请求中添加Authorization
标头。
(fetch规范中定义的CORS预检的一部分),它看起来像Uber不支持
右。这就是Uber API文档中声称他们支持CORS的说法并不完全准确。他们实际上并不完全支持CORS;具体而言,它们的API端点根本不支持处理CORS预检OPTIONS
请求。
在浏览器中运行的前端JavaScript的请求中添加Authorization
标头会导致浏览器执行预检OPTIONS
请求。
因为Uber API端点不支持此功能,所以您无法使用Authorization
请求标头从前端JavaScript代码向Uber API端点发出请求以提供凭据。您需要将access_token
查询参数添加到请求网址。