C# Http请求状态代码405:';Youtube APi

C# Http请求状态代码405:';Youtube APi,c#,api,httprequest,response,http-error,C#,Api,Httprequest,Response,Http Error,我尝试发送这两个请求,但我只收到标题中列出的错误作为响应。 我对google服务器的两个Web请求如下: HttpClient http = new HttpClient(); HttpResponseMessage response = await http.GetAsync("https://accounts.google.com/o/oauth2/token?code="+localSettings.Values["AccessKey"]+"&client_id=XX-XXXXX

我尝试发送这两个请求,但我只收到标题中列出的错误作为响应。 我对google服务器的两个Web请求如下:

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,原因短语:“”,版本:2.0,内容:System.Net.Http.StreamContent,标题:
{
伺服器:GSE
alt svc:quic=“:443”p=“1”ma=604800
缓存控制:最大年龄=0,专用
接受范围:无
日期:2015年9月29日星期二格林尼治标准时间16:05:03
x-frame-options:SAMEORIGIN
改变:接受编码
x-content-type-options:nosniff
备选方案:443:quic,p=1
x-xss-保护:1;模式=块
内容类型:application/json
到期时间:2015年9月29日星期二格林尼治标准时间16:05:03
}
状态代码:400,原因短语:“”,版本:2.0,内容:System.Net.Http.StreamContent,标题:
{
伺服器:GSE
alt svc:quic=“:443”p=“1”ma=604800
缓存控制:最大年龄=0,专用
接受范围:无
日期:2015年9月29日星期二格林尼治标准时间16:05:04
x-frame-options:SAMEORIGIN
变化:X原点
变化:起源
改变:接受编码
x-content-type-options:nosniff
备选方案:443:quic,p=1
x-xss-保护:1;模式=块
内容类型:application/json;字符集=UTF-8
到期时间:2015年9月29日星期二格林尼治标准时间16:05:04

}
如果您可以为导致错误的
localSettings.Values[“AccessKey”]
提供一个值,它会有所帮助。 我猜这个变量包含应该编码的字符。
当您对所说的
localSettings进行注释时,值[“AccessKey”]
可能是
X/XXXXX
。如果生成的url类似于
/token?code=X/XXXXX”…
,您可以尝试
/token?code=X%2FXXXXX
您的第一个请求应该是HTTP POST调用。目前您正在使用GET。
GET似乎导致了错误405,这表明GET方法是不允许的。

在Google API oauth2流(客户端)页面上查看获取oauth2访问令牌的详细信息-

您将注意到,获取访问令牌的资源是o/oauth2/auth,而不是o/oauth2/token(这似乎是您从代码片段中使用的),这应该是服务器响应405(不允许使用方法)的原因

在您正在使用的google api版本中,您是否可以检查o/oauth2/token是否是使用oauth2身份验证码授权类型获取访问令牌以交换客户端id和客户端机密的正确资源

正如一些其他人指出的那样,405响应表明请求的资源不允许使用该方法。在我看来,在API版本3中获得的正确资源是o/oauth2/auth

查看您的代码片段,在我看来,您正在通过“AccessKey”向o/oauth2/token资源发送GET请求“,您的客户端\u id和客户端\u secret以及oauth2 grant\u type=auth\u code,并希望获得访问令牌和刷新令牌;您希望使用由此接收的访问令牌发出下一个GET请求

但是,如前所述,o/oauth2/token似乎不是在Youtube API v3中获取访问令牌的正确资源(假设您试图在v3上实现此功能)


另外,检查如果不能在项目中使用,请使用lib创建一个测试项目,做你想做的事并用

嗅探流量你能发布完整的错误消息吗?@helencrump用调试输出更新了帖子是你试图访问的有效URL吗?@helencrump我真的不知道我被youtube api 2.0到3.0的机会弄糊涂了:这是谷歌的指南:我不知道我做错了什么看来我用的是正确的模式。步骤5是刷新和访问令牌的exchange授权代码,这对我不起作用。我不敢相信没有人试图解释HTTP错误405的实际含义。这意味着您使用了错误的请求动词(
GET
POST
PUT
,等等)。对第一个错误的修复可以简单到将
GetAsync
替换为
PostAsync
。目前看来,第二个错误似乎是第一个错误失败的敲门砖。我还没有详细研究过这一点,但您可能需要从第一个请求的响应中提取一些数据并将其传递给第二个请求。我会给它一个trylocalSettings。Values[“AccessKey”]。ToString().Replace(“/”,“%2F”)没有帮到我,sadlySorry,我没有主意了。也许可以这样做:“…”+HttpUtility.UrlEncode(localSettings.Values[“AccessKey”])+“…”给它一个tryworked给我-我使用的是api的v3版本-是我应该使用的。我将仔细看看api指南。