呼叫airbnb api

时间:2017-03-26 03:12:23

标签: ruby-on-rails ajax api cors airbnb

我一直试图使用这个link的airbnb api。我知道这不是官方的api,但我真的需要在我的网站上使用它。但我得到了 API(跨源资源共享)错误,我无法调用api。当我尝试从投掷时,它的工作非常好。但现在我不确定如何纠正这个?我在后端使用ruby和jquery ajax来调用api。我的ajax代码调用如下。我正在通过此代码在airbnb中创建一个空的列表作为主机。我真的需要这样做。如果还有其他解决方案可以使用airbnb api那么请建议。感谢您的帮助。非常感谢你。

$("#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 个答案:

答案 0 :(得分:3)

要在网络应用中使用来自客户端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格式的响应。

这意味着无法直接从Web应用中运行的客户端JavaScript调用Airbnb API,因为浏览器根本不允许客户端JS代码访问响应。

要确认这一点,请尝试对其API的任何端点URL请求,并查看响应标头:

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信息。