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。