调用非官方 Airbnb API 时出现 CORS 错误 [关闭]

Posted

技术标签:

【中文标题】调用非官方 Airbnb API 时出现 CORS 错误 [关闭]【英文标题】:CORS error while calling the unofficial Airbnb API [closed] 【发布时间】:2017-08-18 20:55:10 【问题描述】:

我一直在尝试使用来自 this link 的 Airbnb API。我知道它不是官方 API,但我真的需要在我的网站上使用它。但我越来越 CORS(跨域资源共享)错误,我无法调用 API。当我从 hurl.it 尝试时,它工作得非常好。

但现在我不确定如何纠正这个问题?我在后端使用 ruby​​ on rails 和 jQuery Ajax 来调用 API。我的 Ajax 代码调用如下。我正在使用此代码在 Airbnb 中创建一个空列表作为房东。

$("#submit_apartments").on("click", function() 
  $.ajax(
    type: "POST",
    url: "https://api.airbnb.com/v1/listings/create?client_id=3092nxybyb0otqw18e8nh5nty",
    headers: 
      "Content-Type": "application/json; charset=UTF-8",
      "X-Airbnb-OAuth-Token": "myAuthToken"
    ,
    data: 
      room_type_category: "private_room",
      property_type_id: 2,
      bathrooms: 1,
      person_capacity: 1,
      beds: 1,
      bedrooms: 1,
      city: "Sunnyvale, California, US"
    ,
    success: function() 
     console.log("Sucess");
    ,
    error: function(xhr,err)
      console.log("Error!!!");
     
   );  
 ); 

【问题讨论】:

【参考方案1】:

要在网络应用程序中通过客户端 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 信息。

【讨论】:

以上是关于调用非官方 Airbnb API 时出现 CORS 错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从 Angular Js(Java Web)调用 API 时出现 CORS 错误

通过 Office Scripts Fetch 调用 API 时出现 CORS 问题

从 localhost Vue 项目调用 api 时出现 NodeJS CORS 错误

Angular 调用 Eureka API 时出现 CORS 来源错误

从 Ajax 调用 Spring Boot Rest API 时出现 CORS 错误

从 Angular 客户端调用 API 时出现身份服务器 CORS 错误