要在网络应用程序中通过客户端 JavaScript 使用 Airbnb API,您需要使用来自 https://github.com/cyu/rack-cors 或类似代码的代码设置自己的 CORS 代理,或者您可以通过开放的 CORS 代理发送请求比如https://cors-anywhere.herokuapp.com/:
$.ajax({
type: "POST",
url: "https://cors-anywhere.herokuapp.com/https://api.airbnb.com/v1/listings/create?client_id=3092nxybyb0otqw18e8nh5nty",
…
}
CORS 代理会将请求发送到 Airbnb API 端点,然后当它从 Airbnb 收到响应时,它会将 Access-Control-Allow-Origin 响应标头和所有其他需要的 CORS 标头添加到它传递给浏览器的响应中,然后浏览器看到的。
但是,请注意,您可能真的不想使用第三方开放代理向任何需要 X-Airbnb-OAuth-Token 访问令牌的登录端点发送请求,因为代理的所有者将能够看到您的 X-Airbnb-OAuth-Token 值并重复使用它。
所以你真的应该设置自己的代理,使用https://github.com/cyu/rack-cors 或类似的。
通过这样的代理发出请求是唯一可行的方法,因为 Airbnb API 本身不会发送 CORS 协议所需的 Access-Control-Allow-Origin 响应标头,而且似乎也不支持替代方案允许您指定回调名称,以便获得 JSONP 格式的响应。
这意味着无法直接从运行在网络应用程序中的客户端 JavaScript 调用 Airbnb API,因为浏览器根本不允许您的客户端 JS 代码访问响应。
要确认这一点,请尝试向任何端点 URL 请求其 API 并查看响应标头:
curl -i -H "Origin: http://example.com" \
"https://api.airbnb.com/v2/search_results?client_id=3092nxybyb0otqw18e8nh5nty"
您将获得的响应标头:
HTTP/1.1 200 OK
Server: nginx/1.7.12
Content-Type: application/json; charset=utf-8
Status: 200 OK
Content-Security-Policy: default-src 'self' https:; connect-src 'self' https: ws://localhost.airbnb.com:8888 http:; font-src 'self' data: *.muscache.com fonts.gstatic.com use.typekit.net; frame-src *; img-src 'self' https: http: data:; media-src 'self' https:; object-src 'self' https:; script-src 'self' https: 'unsafe-eval' 'unsafe-inline' http:; style-src 'self' https: 'unsafe-inline' http:; report-uri /tracking/csp?action=index&controller=v2&req_uuid=cd9b2eb5-5014-4587-8f6b-144c800b6d7b&version=b11f4837d2aaab4f25311eaabfd788770abc5557;
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Cache-Control: no-store, max-age=0, private, must-revalidate
ETag: W/"1dc7df77adc42a864c6a7a6806a68a6f"
X-UA-Compatible: IE=Edge,chrome=1
Strict-Transport-Security: max-age=10886400; includeSubdomains
Date: Sun, 26 Mar 2017 03:31:08 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Connection: Transfer-Encoding
请注意那里没有 Access-Control-Allow-Origin 响应标头。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 有更多 CORS 信息。