【问题标题】:CORS error while calling the unofficial Airbnb API [closed]调用非官方 Airbnb API 时出现 CORS 错误 [关闭]
【发布时间】: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!!!");
     }
   });  
 }); 

【问题讨论】:

    标签: ruby-on-rails ajax api cors


    【解决方案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 信息。

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 2020-06-17
      • 2020-01-21
      • 1970-01-01
      • 2017-10-17
      • 2021-08-30
      • 1970-01-01
      • 2019-07-05
      • 2017-06-03
      相关资源
      最近更新 更多