1

我试图在我的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开发工具的控制台,这是我所看到的:

Dev Tools Console

而且,最有趣的,网络标签:

Dev Tools Network

我的浏览器正在将我的HTTP POST更改为HTTP OPTIONS请求(部分CORS预检定义在第e获取规格),看起来Uber不支持。优步的服务器应该回复响应头,授权我的客户端完成其API请求。相反,他们正在返回一个404

总结:

  • 尤伯杯的文件说,他们支持CORS。
  • 我在Uber的开发人员仪表板中正确设置了我的Origin URI
  • CORS规范说明如果我使用授权标头进行HTTP POST,这是一个非简单请求,并且需要HTTP OPTIONS预检。
  • 我的浏览器正在做确切的是,使用包括起源头HTTP方法OPTIONS发送请求(其匹配的来源URI集合在我的乌伯开发人员信息中心。)
  • 乌伯被返回状态404(未找到)

任何人都知道这里发生了什么?

+0

当所有其他操作失败时,在您控制的服务器上设置代理 – charlietfl

回答

1

当发出请求尤伯杯从前端的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请求......

为了更精确:浏览器不改变POSTOPTIONS;而不是POST请求之前,浏览器做OPTIONS请求。浏览器这样做的原因是因为您的代码在请求中添加了一个Authorization标头。

,它看起来像尤伯杯(在取预检规范中定义的CORS的部分)不支持

权。这就是Uber API文档中他们支持CORS的说法并不完全准确。他们实际上并不完全支持CORS;特别是,它们的API端点根本不支持处理CORS预检OPTIONS请求。

然后将一个Authorization标头添加到前端运行在浏览器中的JavaScript请求中,导致浏览器执行预检OPTIONS请求。

因此,由于Uber API端点不支持该功能,因此您无法使用Authorization请求标头向前端JavaScript代码向Uber API端点发出请求以提供凭据。您需要将access_token查询参数添加到请求URL。