我没有使用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明智地建议我尝试与邮递员打电话。
我现在已经确定我可以在邮递员中打电话并得到正确的回复。
答案 0 :(得分:4)
当Airbnb希望将其作为网址参数时,您发送的请求会将client_id
作为HTTP标头。
此外,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¤cy=GBP");
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
await client.GetAsync(uri);
答案 1 :(得分:0)
我无法将单个答案标记为评论中的解决方案。
<强>解决方案强>
非常感谢所有帮助共同完成这些步骤的人。
答案 2 :(得分:0)
您可能需要在名为_aat的请求中添加一个cookie,其中包含airbnb访问令牌。这是在登录期间生成的。登录后浏览自己的列表时,可以通过查看Fiddler的标题或浏览器开发工具的Net部分的标题来查看它。只需将其从此处复制并粘贴到代码中以测试是否可以使请求正常运行,然后稍后您可以自动化在代码中获取_aat cookie的过程。确保代码中的http标头也与通过浏览器发送的标头匹配。