2016-06-02 4 views
0

Просто попробуйте получить токен доступа к API Twitter с помощью программы C# .net. Я сочинил запрос HTTP POST следующим образом (выезд из заявления на вылов для экономии места):.net twitter api Отсутствует необходимый параметр: grant_type: forbidden_missing_parameter

 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 апи посылает обратно ответ: {"errors":[{"code":"170","message":"Missing required parameter: grant_type","label":"forbidden_missing_parameter}]}

Я понимаю, что значит ошибка. Это говорит мне, что я не включаю контент-корпус grant_type=client_credentials. Но, как вы видите, я посылаю этот контент-тело с помощью метода Stream.Write.

Сначала я предположил, что это потому, что строка не была UrlEncoded, возможно, ей нужна обратная косая черта перед значком равенства или чем-то еще. Поэтому я UrlEncoded строки, чтобы убедиться. Я думаю, что он все равно должен быть в неправильном формате, но я не уверен, как это сделать.

Почему Twitter не получает контент-тело, которое я им посылаю?

Обновление: Я принял совет @Linvi и скопировал именно формат статьи по адресу How to set the content of an HttpWebRequest in C#?. Вот мой текущий код:

 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}]}.

Я тестировал это с помощью локальной программы, которая просматривает тело контента, и оно выходит нулевым. Я не могу понять, почему мое содержание не написано.

+0

Возможный дубликат [Как установить содержание в HttpWebRequest в C#?] (Http://stackoverflow.com/questions/5527316/how-to-set-the-content-of-the-httpwebrequest-in-c) – Linvi

ответ

-1

Наконец получил его на работу , Мне пришлось остановить 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(); 
1

Было бы хорошо, если бы вы поделились дополнительной информацией, но касались 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); 

Источник: How to set the content of an HttpWebRequest in C#?

+0

То, что вы указали, является тем, что, как я предполагал, будет работать, но HttpWebRequest не имеет свойства Content. Если я попытаюсь включить вашу строку, я получаю сообщение об ошибке «HttpWebRequest не содержит определения для« Content » – jimboweb

+0

Это относится к« Microsoft.Net.HttpClient ». У меня нет времени прямо сейчас, чтобы дать вам версию решения HttpWebRequest, но я это сделаю. – Linvi

+0

Чтобы установить содержимое 'HttpWebRequest', смотрите здесь http://stackoverflow.com/questions/5527316/how-to-set-the-content-of-an-httpwebrequest-in-c – Linvi

Смежные вопросы