c# - 从 C# 调用 AirBnb api 时出现 403

标签 c# dotnet-httpclient

我之前没有使用过 HttpClient,如果它很明显,我深表歉意。

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

我对端点的理解是我不需要身份验证 token ,因为这是我尝试使用的公共(public)端点。不幸的是,无论我尝试做什么,我都会收到 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 明智地建议我尝试与 postman 联系。

我现在已经确定我可以在 postman 中调用电话并得到正确的回复。

最佳答案

您发送的请求将 client_id 作为 HTTP header ,而爱彼迎希望它作为 URL 参数。

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

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

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);

关于c# - 从 C# 调用 AirBnb api 时出现 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43216388/

相关文章:

c# - 如何在 C# 中模拟来自 httpclient 的响应,Azure 函数,如何测试

c# - 如何在没有 "new' ing"类实例并自己提供参数的情况下进行依赖注入(inject)?

c# - 如何在 .Net 的 GoogleWebAuthorizationBroker.AuthorizeAsync 方法中发送存储为 json 字符串(在数据库中)的 Google 驱动 token ?

c# - 如何读取特定文件夹中的所有文件并过滤多种类型?

c# - "this"如何在C#中传递

c# - Xamarin.Android HTTP 随机延迟

c# - 在运行时从 C# 检测 F# 记录类型

asp.net-core - 使用 httpClient.postasync 进行 Web api 调用 .netcore

c# - HttpClient .Result 在使用 [WebMethod] 属性时挂起

c# - 区分超时和用户取消