【问题标题】:Http Request Status Code 405 ReasonPhrase: '' Youtube APiHttp 请求状态码 405 ReasonPhrase: '' Youtube APi
【发布时间】:2015-12-27 04:50:45
【问题描述】:

我尝试发送这两个请求,但我只收到标题中列出的错误作为响应。 我对谷歌服务器的两个网络请求是这样的:

HttpClient http = new HttpClient();

HttpResponseMessage response = await http.GetAsync("https://accounts.google.com/o/oauth2/token?code="+localSettings.Values["AccessKey"]+"&client_id=XX-XXXXXXXXXX.apps.googleusercontent.com&client_secret=XXXXX-XXXX&redirect_uri=http://localhost/oauth2callback&grant_type=authorization_code");

//response.EnsureSuccessStatusCode();
Debug.WriteLine(response.ToString());
HttpResponseMessage response1 = await http.GetAsync("https://content.googleapis.com/youtube/v3/subscriptions?part=id&maxResults=10&mine=true&key="+localSettings.Values["AccessKey"]);
Debug.WriteLine(response1.ToString());

我从调试器得到以下输出:

StatusCode: 405, ReasonPhrase: '', Version: 2.0, Content: System.Net.Http.StreamContent, Headers:
{
  server: GSE
  alt-svc: quic=":443"; p="1"; ma=604800
  cache-control: max-age=0, private
  accept-ranges: none
  date: Tue, 29 Sep 2015 16:05:03 GMT
  x-frame-options: SAMEORIGIN
  vary: Accept-Encoding
  x-content-type-options: nosniff
  alternate-protocol: 443:quic,p=1
  x-xss-protection: 1; mode=block
  content-type: application/json
  expires: Tue, 29 Sep 2015 16:05:03 GMT
}
StatusCode: 400, ReasonPhrase: '', Version: 2.0, Content: System.Net.Http.StreamContent, Headers:
{
  server: GSE
  alt-svc: quic=":443"; p="1"; ma=604800
  cache-control: max-age=0, private
  accept-ranges: none
  date: Tue, 29 Sep 2015 16:05:04 GMT
  x-frame-options: SAMEORIGIN
  vary: X-Origin
  vary: Origin
  vary: Accept-Encoding
  x-content-type-options: nosniff
  alternate-protocol: 443:quic,p=1
  x-xss-protection: 1; mode=block
  content-type: application/json; charset=UTF-8
  expires: Tue, 29 Sep 2015 16:05:04 GMT
}

【问题讨论】:

  • 能否请您发布完整的错误信息?
  • @helencrump 更新了带有调试输出的帖子
  • 您尝试访问的 URL 是否有效?
  • @helencrump 我真的不知道我对从 youtube api 2.0 到 3.0 的机会感到困惑:这是来自谷歌的指南:developers.google.com/youtube/2.0/… 我不知道我做错了什么看来我使用的是正确的模式。第 5 步是刷新和访问令牌的交换授权代码,这对我不起作用。
  • 我不敢相信没有人试图解释 HTTP 错误 405 的实际含义。这意味着您使用了错误的请求动词(GETPOSTPUT 等)。修复第一个错误可能很简单,只需将GetAsync 替换为PostAsync。就目前而言,第二个错误似乎是第一个失败的连锁反应。我没有对此进行详细研究,但您可能需要从对第一个请求的响应中提取一些数据并将其传递给第二个请求。

标签: c# api httprequest response http-error


【解决方案1】:

如果你不能在你的项目中使用Google.Apis.YouTube.v3 Client Library,用lib创建一个测试项目,做你想做的事,用fiddler嗅探流量

【讨论】:

    【解决方案2】:

    在 Google API OAuth2 Flow (Client side) 页面查看获​​取 oauth2 访问令牌的详细信息 - https://developers.google.com/youtube/v3/guides/auth/client-side-web-apps#Obtaining_Access_Tokens

    您会注意到获取访问令牌的资源是 o/oauth2/auth 而不是 o/oauth2/token(这似乎是您在代码 sn-p 中使用的) - 这应该是来自服务器的 405(不允许的方法)响应的原因。

    在您使用的 google api 版本中,您能否使用 oauth2 auth_code 授权类型检查 o/oauth2/token 是否是获取访问令牌以换取客户端 ID 和客户端密码的正确资源?

    正如其他几个人指出的那样,405 响应表明该方法不适用于所请求的资源。在我看来,API 版本 3 中 GET 的正确资源是 o/oauth2/auth。

    查看您的代码 sn-p,在我看来,您正在向 o/oauth2/token 资源发送一个 GET 请求,通过您的“AccessKey”、您的 client_id 和您的 client_secret 以及 oauth2 grant_type=auth_code 发送并期望取回访问令牌和刷新令牌;并且您希望使用收到的访问令牌来发出下一个 GET 请求。

    但是,如前所述,o/oauth2/token 似乎不是在 Youtube API v3 中获取访问令牌的正确资源(假设您尝试在 v3 上进行这项工作)

    另外,请查看https://developers.google.com/youtube/v3/getting-started

    如果您没有使用(/尝试使用)API v3,请告诉我。

    【讨论】:

    【解决方案3】:

    您的第一个请求应该是 HTTP POST 调用。目前您正在使用 GET。 GET 似乎导致错误 405,这表明不允许使用 GET 方法。

    【讨论】:

      【解决方案4】:

      如果您可以为导致错误的localSettings.Values["AccessKey"] 提供一个值,那将会有所帮助。 我的猜测是这个变量包含应该编码的字符。 当你评论你说的localSettings.Values["AccessKey"] 可能是X/XXXXX。如果生成的 url 类似于/token?code=X/XXXXX"...,你可以试试/token?code=X%2FXXXXX

      【讨论】:

      • 我会试试的
      • localSettings.Values["AccessKey"].ToString().Replace("/","%2F") 遗憾地没有帮助我
      • 对不起,我没办法了。也许这样做:“...” + HttpUtility.UrlEncode(localSettings.Values["AccessKey"]) + "..." 试试看
      猜你喜欢
      • 1970-01-01
      • 2018-01-05
      • 2016-05-24
      • 2015-04-23
      • 1970-01-01
      • 2015-10-17
      • 2016-07-11
      • 2020-11-15
      • 1970-01-01
      相关资源
      最近更新 更多