2016-03-16 4 views
5

Я новичок в JSON и C# и пытаюсь написать код, который будет выполнять POST-запрос HTTP для получения токена. Ниже мой код, но я продолжаю получать 400 плохих запросов. Наверное, мои коды просто неверны, и я буду признателен за любую помощь в этом. Ниже мои коды:C# JSON Сообщение с использованием HttpWebRequest

static public string GetAuthorizationToken() 
       { 
        string token = string.Empty; 

        string requestUrl = "some URL"; 
        HttpWebRequest httpWebRequest = WebRequest.Create(requestUrl) as HttpWebRequest; 
        httpWebRequest.Method = "POST"; 
        httpWebRequest.ContentType = "x-www-form-urlencoded"; 


        Dictionary<string, string> postParameters = new Dictionary<string, string>(); 
        postParameters.Add("grant", "some credentials"); 
        postParameters.Add("id", "1234123411"); 
        postParameters.Add("secret", "1234123411"); 
        postParameters.Add("scope", "abcd"); 

        string postData = ""; 

        foreach (string key in postParameters.Keys) 
        { 
         postData += WebUtility.UrlEncode(key) + "=" 
           + WebUtility.UrlEncode(postParameters[key]) + "&"; 
        }      

        byte[] data = Encoding.ASCII.GetBytes(postData); 

        httpWebRequest.ContentLength = data.Length; 

        Stream requestStream = httpWebRequest.GetRequestStream(); 
        requestStream.Write(data, 0, data.Length); 
        requestStream.Close(); 

        TokenResponse tokenResponse = new TokenResponse(); 

        using (HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse) 
        { 
         if (response.StatusCode != HttpStatusCode.OK) 
          throw new Exception(String.Format(
          "Server error (HTTP {0}: {1}).", 
          response.StatusCode, 
          response.StatusDescription)); 

         DataContractJsonSerializer responseSerializer = new DataContractJsonSerializer(typeof(TokenResponse)); 
         Stream responseStream = response.GetResponseStream(); 
         object objResponse = responseSerializer.ReadObject(responseStream); 

         tokenResponse = objResponse as TokenResponse; 
         response.Close(); 

         if (tokenResponse != null) 
         { 
          return tokenResponse.accessToken; 
         } 
        } 
        return token; 
    } 
+1

Тип контента неверен для тела запроса JSON. Попробуйте «application/json» вместо «x-www-form-urlencoded» (который предназначен для стандартных данных строки запроса) – Quintium

+0

Спасибо Quintium. Вероятно, моя ошибка заключалась в использовании JSON в запросе, в то время как тип содержимого предназначен для данных строки запроса. Я обновил коды ниже и по-прежнему получаю 400 ошибок с ошибкой. – BanggaDad

+0

Может быть полностью несвязанным, но обычно данные аутентификации отправляются в заголовке, и может ли это быть причиной? –

ответ

14

Вот точный и точный пример запроса POST и читает ответ (хотя и без сериализации данных JSON). Только ошибка, которую я вижу до сих пор в вашем коде, является неправильным ContentType, мы не можем видеть, какой URL-адрес вы пытаетесь отправить серверу (но вероятность того, что он неверен). Надеюсь, это поможет вам продвинуться.

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.IO; 

namespace SExperiment 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      try{ 
       string webAddr="http://gurujsonrpc.appspot.com/guru"; 

       var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr); 
       httpWebRequest.ContentType = "application/json; charset=utf-8"; 
       httpWebRequest.Method = "POST";  

       using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
       { 
        string json = "{ \"method\" : \"guru.test\", \"params\" : [ \"Guru\" ], \"id\" : 123 }"; 

        streamWriter.Write(json); 
        streamWriter.Flush(); 
       } 
       var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
       using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
       { 
        var responseText = streamReader.ReadToEnd(); 
        Console.WriteLine(responseText); 

        //Now you have your response. 
        //or false depending on information in the response  
       } 
      }catch(WebException ex){ 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 
} 
+0

Большое спасибо Кенту. – BanggaDad

+0

Если это помогло вам ответить на ваш вопрос или каким-либо другим способом перейти от вашего мертвого, то выберите это как ваш принятый ответ. –

-2

Вы установили requestUrl в «некоторый URL». Попробуйте использовать существующий веб-адрес в дополнение к изменению типа контента на «application/json».

+1

Я уверен, что он использовал правильный URL-адрес в своем исходном коде, так как иначе он получил бы ошибку DNS вместо 400 Bad запросов. – derpirscher

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