.net 推特 api 缺少必需的参数:grant_type:forbidden_missing_parameter
.net twitter api Missing required parameter: grant_type:forbidden_missing_parameter
只是尝试使用 c# .net 程序获取 Twitter API 的访问令牌。我按如下方式编写了 http post 请求(省略了 catch 语句以保存 space):
HttpWebRequest request;
request = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth2/token");
request.Method = "POST";
request.Host = "api.twitter.com";
request.UserAgent = "Dev Site";
request.Headers.Set("Authorization", "Basic " + credentialBase64);
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
//request.Headers.Set("Accept-Encoding", "gzip");
try
{
WebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
byte[] requestBody = ASCIIEncoding.ASCII.GetBytes(HttpUtility.UrlEncode("grant_type=client_credentials"));
request.ContentLength = requestBody.Length;
dataStream.Write(requestBody, 0, requestBody.Length);
StreamReader reader = new StreamReader(dataStream);
twitterString = reader.ReadToEnd();
}
Twitter api 正在发回响应:
{"errors":[{"code":"170","message":"Missing required parameter: grant_type","label":"forbidden_missing_parameter}]}
我明白错误的意思。它告诉我我没有包括内容主体 grant_type=client_credentials
。但是正如您所看到的,我正在使用 Stream.Write
方法发送该内容主体。
一开始我以为是因为字符串没有经过UrlEncoded,可能是等号前需要一个反斜杠什么的。所以我 UrlEncoded 字符串只是为了确保。我想它一定还是格式不对,但我不确定是怎么回事。
为什么 Twitter api 没有收到我发送给他们的内容正文?
更新:我听取了@Linvi 的建议,并完全复制了 文章的格式。这是我当前的代码:
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(HttpUtility.UrlEncode("grant_type=client_credentials"));
var webReq = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth2/token");
webReq.Method = "POST";
webReq.Host = "api.twitter.com";
webReq.Headers.Set("Authorization", "Basic " + credentialBase64);
webReq.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
webReq.ContentLength = buffer.Length;
var reqStream = webReq.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
var webResp = (HttpWebResponse)webReq.GetResponse();
我仍然收到格式为“403”的响应:{"errors":[{"code":"170","message":"Missing required parameter: grant_type","label":"forbidden_missing_parameter}]}
。
我已经用查看内容主体的本地程序对此进行了测试,结果为空。我无法弄清楚为什么我的内容正文没有被写入。
如果您实际上分享了更多关于 grant_type
的信息,那将是很好的,如果您想使用仅应用程序凭据(仅使用消费者密钥和消费者秘密),则需要它。
在这种情况下,您需要将其添加到您的 HttpRequestMessage
(HttpClient) 中:
request.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");
对于旧的 HttpWebRequest 使用:
byte[] requestBytes = new ASCIIEncoding().GetBytes(inputData);
//get the request stream to write the post to
Stream requestStream = request.GetRequestStream();
//write the post to the request stream
requestStream.Write(requestBytes, 0, requestBytes.Length);
来源:
终于成功了。我不得不停止对授权类型请求进行 urlencoding。对于任何其他试图从 Twitter api 获取访问令牌的人,这里是有效的代码:
byte[] buffer = ASCIIEncoding.ASCII.GetBytes("grant_type=client_credentials");
var webReq = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth2/token");
webReq.Method = "POST";
webReq.Host = "api.twitter.com";
webReq.Headers.Set("Authorization", "Basic " + credentialBase64);
webReq.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
webReq.ContentLength = buffer.Length;
var reqStream = webReq.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
var webResp = (HttpWebResponse)webReq.GetResponse();
只是尝试使用 c# .net 程序获取 Twitter API 的访问令牌。我按如下方式编写了 http post 请求(省略了 catch 语句以保存 space):
HttpWebRequest request;
request = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth2/token");
request.Method = "POST";
request.Host = "api.twitter.com";
request.UserAgent = "Dev Site";
request.Headers.Set("Authorization", "Basic " + credentialBase64);
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
//request.Headers.Set("Accept-Encoding", "gzip");
try
{
WebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
byte[] requestBody = ASCIIEncoding.ASCII.GetBytes(HttpUtility.UrlEncode("grant_type=client_credentials"));
request.ContentLength = requestBody.Length;
dataStream.Write(requestBody, 0, requestBody.Length);
StreamReader reader = new StreamReader(dataStream);
twitterString = reader.ReadToEnd();
}
Twitter api 正在发回响应:
{"errors":[{"code":"170","message":"Missing required parameter: grant_type","label":"forbidden_missing_parameter}]}
我明白错误的意思。它告诉我我没有包括内容主体 grant_type=client_credentials
。但是正如您所看到的,我正在使用 Stream.Write
方法发送该内容主体。
一开始我以为是因为字符串没有经过UrlEncoded,可能是等号前需要一个反斜杠什么的。所以我 UrlEncoded 字符串只是为了确保。我想它一定还是格式不对,但我不确定是怎么回事。
为什么 Twitter api 没有收到我发送给他们的内容正文?
更新:我听取了@Linvi 的建议,并完全复制了 文章的格式。这是我当前的代码:
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(HttpUtility.UrlEncode("grant_type=client_credentials"));
var webReq = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth2/token");
webReq.Method = "POST";
webReq.Host = "api.twitter.com";
webReq.Headers.Set("Authorization", "Basic " + credentialBase64);
webReq.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
webReq.ContentLength = buffer.Length;
var reqStream = webReq.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
var webResp = (HttpWebResponse)webReq.GetResponse();
我仍然收到格式为“403”的响应:{"errors":[{"code":"170","message":"Missing required parameter: grant_type","label":"forbidden_missing_parameter}]}
。
我已经用查看内容主体的本地程序对此进行了测试,结果为空。我无法弄清楚为什么我的内容正文没有被写入。
如果您实际上分享了更多关于 grant_type
的信息,那将是很好的,如果您想使用仅应用程序凭据(仅使用消费者密钥和消费者秘密),则需要它。
在这种情况下,您需要将其添加到您的 HttpRequestMessage
(HttpClient) 中:
request.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");
对于旧的 HttpWebRequest 使用:
byte[] requestBytes = new ASCIIEncoding().GetBytes(inputData);
//get the request stream to write the post to
Stream requestStream = request.GetRequestStream();
//write the post to the request stream
requestStream.Write(requestBytes, 0, requestBytes.Length);
来源:
终于成功了。我不得不停止对授权类型请求进行 urlencoding。对于任何其他试图从 Twitter api 获取访问令牌的人,这里是有效的代码:
byte[] buffer = ASCIIEncoding.ASCII.GetBytes("grant_type=client_credentials");
var webReq = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth2/token");
webReq.Method = "POST";
webReq.Host = "api.twitter.com";
webReq.Headers.Set("Authorization", "Basic " + credentialBase64);
webReq.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
webReq.ContentLength = buffer.Length;
var reqStream = webReq.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
var webResp = (HttpWebResponse)webReq.GetResponse();