Uber API CORS 问题
Uber API issue with CORS
第一次在这里提问。我是这方面的初学者,但我真的对我面临的问题感到困惑。
正在使用的浏览器:
- Safari 和 Firefox(都在 Mac OS Sierra 上)
- Firefox (Linux - Ubuntu 16.04.2)
我已注册为 Uber 开发人员,并已在控制面板中注册了一个应用程序。我目前只使用服务器令牌进行身份验证。在仪表板中,我在 CORS 应用程序的 "Authorizations" 选项卡中设置了以下条目(CORS 支持的可选 URI):
http://localhost:8000 <-- web server in my PC
https://subdomain.mydomain.com <--- remote web server
几个月前,我使用 HTML、CSS 和 JS(使用 Jquery v2.2.4)创建了一个网络应用程序来玩转行程估算 API 并且能够成功地报告我所在地区许多位置的数据。不知何故它不再有效。我正在尝试解决这个问题并改进功能。但是,由于之前不存在的 CORS 问题,我无法通过对 API 的初始查询。
我的APIURL是:
https://api.uber.com/v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********}
当我将其粘贴到浏览器的地址栏中时,我得到有效 JSON:
{"prices":[{"localized_display_name":"uberX","distance":1.58,"display_name":"uberX","product_id":"811c3224-5554-4d29-98ae-c4366882011f","high_estimate":3,"surge_multiplier":1.0,"minimum":2,"low_estimate":2,"duration":420,"estimate":"2-3\u00a0$","currency_code":"USD"},{"localized_display_name":"X English","distance":1.58,"display_name":"X English","product_id":"8fe2c122-a4f0-43cc-97e0-ca5ef8b57fbc","high_estimate":4,"surge_multiplier":1.0,"minimum":3,"low_estimate":3,"duration":420,"estimate":"3-4\u00a0$","currency_code":"USD"},{"localized_display_name":"uberXL","distance":1.58,"display_name":"uberXL","product_id":"eb454d82-dcef-4d56-97ca-04cb11844ff2","high_estimate":4,"surge_multiplier":1.0,"minimum":3,"low_estimate":3,"duration":420,"estimate":"3-4\u00a0$","currency_code":"USD"},{"localized_display_name":"Uber Black","distance":1.58,"display_name":"Uber Black","product_id":"ba49000c-3b04-4f54-8d50-f7ae0e20e867","high_estimate":6,"surge_multiplier":1.0,"minimum":4,"low_estimate":4,"duration":420,"estimate":"4-6\u00a0$","currency_code":"USD"},{"localized_display_name":"Uber SUV","distance":1.58,"display_name":"Uber SUV","product_id":"65aaf0c2-655a-437d-bf72-5d935cf95ec9","high_estimate":7,"surge_multiplier":1.0,"minimum":5,"low_estimate":5,"duration":420,"estimate":"5-7\u00a0$","currency_code":"USD"}]}
然后我继续在网页中设置 JS(w/JQuery)代码...
var url = "https://api.uber.com/v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********}";
$.getJSON(url, function(result){
console.log(result);
});
将 HTML 和 JS 上传到我的远程 Web 服务器,然后在我的任何浏览器中加载该网页会产生来自 Uber API 的 200 状态。但是,控制台日志显示 CORS 阻止了我的请求(问题 #1):
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.uber.com/v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********}. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
然后,在两个 Mac 浏览器的检查器视图中,在网络/资源区域下,我看到来自 GET 请求的 200 状态消息。但是,连同响应消息(问题 #2):
SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
请求Headers是:
GET /v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********} HTTP/1.1
Host: api.uber.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://subdomain.domain.com/Uber/index.html
Origin: https://subdomain.domain.com
Connection: keep-alive
响应Headers是:
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 19 Mar 2017 22:26:31 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Content-Geo-System: wgs-84
Content-Language: en
X-Rate-Limit-Limit: 2000
X-Rate-Limit-Remaining: 1998
X-Rate-Limit-Reset: 1489964400
X-Uber-App: uberex-nonsandbox, optimus, migrator-uberex-optimus
Strict-Transport-Security: max-age=604800
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
在 Linux 的 Firefox 中,我有时不会收到语法错误;我似乎总是在 Mac 浏览器上找到它。在 Linux 中,当我收到该错误时,单击 "Edit and Resend" Headers 按钮(重新发送 Headers 但没有真正编辑 Headers),语法错误消失,响应文本实际上显示了本应存在的 Uber API Object...但我仍然在控制台日志中收到 CORS Blocked 消息。我真的不明白这是为什么,但似乎很矛盾。最后,我无法使用 API 数据,几个月前使用相同的方法,我可以获得几十个位置的数据。
我曾在类似问题中寻找答案,但目前已找到适用于我的情况的 none。任何帮助将不胜感激。真的很沮丧……真的卡在这里了。
此问题是由 API 未正确包含 header 引起的。此问题已解决,api 现在按预期工作。此外,只有在请求中指定了来源时,才会在响应中返回允许来源 header。
第一次在这里提问。我是这方面的初学者,但我真的对我面临的问题感到困惑。
正在使用的浏览器:
- Safari 和 Firefox(都在 Mac OS Sierra 上)
- Firefox (Linux - Ubuntu 16.04.2)
我已注册为 Uber 开发人员,并已在控制面板中注册了一个应用程序。我目前只使用服务器令牌进行身份验证。在仪表板中,我在 CORS 应用程序的 "Authorizations" 选项卡中设置了以下条目(CORS 支持的可选 URI):
http://localhost:8000 <-- web server in my PC
https://subdomain.mydomain.com <--- remote web server
几个月前,我使用 HTML、CSS 和 JS(使用 Jquery v2.2.4)创建了一个网络应用程序来玩转行程估算 API 并且能够成功地报告我所在地区许多位置的数据。不知何故它不再有效。我正在尝试解决这个问题并改进功能。但是,由于之前不存在的 CORS 问题,我无法通过对 API 的初始查询。
我的APIURL是:
https://api.uber.com/v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********}
当我将其粘贴到浏览器的地址栏中时,我得到有效 JSON:
{"prices":[{"localized_display_name":"uberX","distance":1.58,"display_name":"uberX","product_id":"811c3224-5554-4d29-98ae-c4366882011f","high_estimate":3,"surge_multiplier":1.0,"minimum":2,"low_estimate":2,"duration":420,"estimate":"2-3\u00a0$","currency_code":"USD"},{"localized_display_name":"X English","distance":1.58,"display_name":"X English","product_id":"8fe2c122-a4f0-43cc-97e0-ca5ef8b57fbc","high_estimate":4,"surge_multiplier":1.0,"minimum":3,"low_estimate":3,"duration":420,"estimate":"3-4\u00a0$","currency_code":"USD"},{"localized_display_name":"uberXL","distance":1.58,"display_name":"uberXL","product_id":"eb454d82-dcef-4d56-97ca-04cb11844ff2","high_estimate":4,"surge_multiplier":1.0,"minimum":3,"low_estimate":3,"duration":420,"estimate":"3-4\u00a0$","currency_code":"USD"},{"localized_display_name":"Uber Black","distance":1.58,"display_name":"Uber Black","product_id":"ba49000c-3b04-4f54-8d50-f7ae0e20e867","high_estimate":6,"surge_multiplier":1.0,"minimum":4,"low_estimate":4,"duration":420,"estimate":"4-6\u00a0$","currency_code":"USD"},{"localized_display_name":"Uber SUV","distance":1.58,"display_name":"Uber SUV","product_id":"65aaf0c2-655a-437d-bf72-5d935cf95ec9","high_estimate":7,"surge_multiplier":1.0,"minimum":5,"low_estimate":5,"duration":420,"estimate":"5-7\u00a0$","currency_code":"USD"}]}
然后我继续在网页中设置 JS(w/JQuery)代码...
var url = "https://api.uber.com/v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********}";
$.getJSON(url, function(result){
console.log(result);
});
将 HTML 和 JS 上传到我的远程 Web 服务器,然后在我的任何浏览器中加载该网页会产生来自 Uber API 的 200 状态。但是,控制台日志显示 CORS 阻止了我的请求(问题 #1):
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.uber.com/v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********}. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
然后,在两个 Mac 浏览器的检查器视图中,在网络/资源区域下,我看到来自 GET 请求的 200 状态消息。但是,连同响应消息(问题 #2):
SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
请求Headers是:
GET /v1/estimates/price?start_latitude=8.969145&start_longitude=-79.5177675&end_latitude=8.984104&end_longitude=-79.517467&server_token={*********SERVER*TOKEN**********} HTTP/1.1
Host: api.uber.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://subdomain.domain.com/Uber/index.html
Origin: https://subdomain.domain.com
Connection: keep-alive
响应Headers是:
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 19 Mar 2017 22:26:31 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Content-Geo-System: wgs-84
Content-Language: en
X-Rate-Limit-Limit: 2000
X-Rate-Limit-Remaining: 1998
X-Rate-Limit-Reset: 1489964400
X-Uber-App: uberex-nonsandbox, optimus, migrator-uberex-optimus
Strict-Transport-Security: max-age=604800
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
在 Linux 的 Firefox 中,我有时不会收到语法错误;我似乎总是在 Mac 浏览器上找到它。在 Linux 中,当我收到该错误时,单击 "Edit and Resend" Headers 按钮(重新发送 Headers 但没有真正编辑 Headers),语法错误消失,响应文本实际上显示了本应存在的 Uber API Object...但我仍然在控制台日志中收到 CORS Blocked 消息。我真的不明白这是为什么,但似乎很矛盾。最后,我无法使用 API 数据,几个月前使用相同的方法,我可以获得几十个位置的数据。
我曾在类似问题中寻找答案,但目前已找到适用于我的情况的 none。任何帮助将不胜感激。真的很沮丧……真的卡在这里了。
此问题是由 API 未正确包含 header 引起的。此问题已解决,api 现在按预期工作。此外,只有在请求中指定了来源时,才会在响应中返回允许来源 header。