繁体   English   中英

从 C# 调用 AirBnb api 时出现 403

[英]403 when calling AirBnb api from C#

我之前没有使用过 HttpClient 如果它是一个明显的,那么抱歉。

我正在使用 airbnb api http://airbnbapi.org/#view-listing-info

我对端点的理解是我不需要身份验证令牌,因为这是我尝试使用的公共端点。 不幸的是,无论我尝试做什么,我都会得到 403,我不完全确定为什么。

我有以下代码:

        client.DefaultRequestHeaders.Add("client_id", "<My client Id>");
        client.DefaultRequestHeaders.Add("locale", "en-gb");
        client.DefaultRequestHeaders.Add("currency", "gbp");

        var request = new HttpRequestMessage()
        {
            RequestUri = new Uri($"https://api.airbnb.com/v2/listings/{id}"),
            Method = HttpMethod.Get,
        };

        var task = client.SendAsync(request)
            .ContinueWith((taskwithmsg) =>
            {
                var response = taskwithmsg.Result;

                //var jsonTask = response.Content.ReadAsAsync<JsonResult>();
                //jsonTask.Wait();
                //var jsonObject = jsonTask.Result;


                return response.Content;
            });
        task.Wait();

        return task.Result;

我收到以下回复:

-       response    {StatusCode: 403, ReasonPhrase: 'Forbidden', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Connection: close
  Date: Tue, 04 Apr 2017 19:44:40 GMT
  Server: AkamaiGHost
  Mime-Version: 1.0
  Content-Length: 291
  Content-Type: text/html
  Expires: Tue, 04 Apr 2017 19:44:40 GMT
}}  System.Net.Http.HttpResponseMessage

有什么建议吗?

编辑

Macceturra 明智地建议我尝试与邮递员打个电话。

我现在已经确定我可以通过邮递员拨打电话并得到正确的回复。

您发送的请求将client_id作为 HTTP 标头,而 Airbnb 期望它作为 URL 参数。

此外,Airbnb 要求客户端发送Accept (或User-Agent )标头,否则它仍然会返回“403 Forbidden”(可能应该是“400 Bad Request”)。

将它们放在一起(并删除不必要的标题):

var id = ...;
var clientId = ...;
var uri = new Uri($"https://api.airbnb.com/v2/listings/{id}?client_id={Uri.EscapeDataString(clientId)}&locale=en-gb&currency=GBP");
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
await client.GetAsync(uri);

我无法在评论中将单个答案标记为解决方案。

解决方案

  • 首先在邮递员中拨打电话。 这帮助我意识到我应该将客户端 ID 作为 url 参数而不是作为标头传递。 布拉德利·格兰杰 (Bradley Grainger) 也接着回答了这个问题。
  • 尝试使用 HttpClient 进行精确调用。 这仍然返回 403,但现在我们对我们发送的 url 有信心。
  • 将内容类型更改为 application/json。 这击败了 403 并为我们提供了 200 所请求的数据。

非常感谢所有帮助拼凑这些步骤的人。

您可能需要向名为 _aat 的请求添加一个 cookie,其中包含 airbnb 访问令牌。 这是在登录期间生成的。 在登录时浏览您自己的列表之一时,您将能够通过查看 Fiddler 中的标题或浏览器开发工具的 Net 部分来查看它。只需将其从那里复制并粘贴到您的代码中以测试是否可以使请求正常工作,然后您可以自动执行在代码中获取 _aat cookie 的过程。 确保代码中的 http 标头也与通过浏览器发送的内容相匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM