2016-03-16 19 views
5

Ich bin neu in JSON und C# und versuchen, einen Code zu schreiben, der eine HTTP-Web-Anfrage POST ausführen wird, um ein Token zu erhalten. Unten ist mein Code, aber ich bekomme immer 400 schlechte Anfragen. Wahrscheinlich sind meine Codes einfach inkorrekt und ich werde für jede Hilfe dankbar sein. Unten ist mein Code:C# JSON Beitrag mit 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

Content-Type ist für einen JSON-Anfragetext falsch. Versuchen Sie "application/json" anstelle von "x-www-form-urlencoded" (was für Standard-Abfragezeichenfolgedaten ist) – Quintium

+0

Danke Quintium. Wahrscheinlich war es mein Fehler, JSON in der Anfrage zu verwenden, während der Inhaltstyp für Abfrage-String-Daten ist. Ich habe die untenstehenden Codes aktualisiert und erhalte immer noch 400 fehlerhafte Fehler. – BanggaDad

+0

Könnte völlig unabhängig sein, aber normalerweise Authentifizierungsdaten in der Kopfzeile gesendet, und könnte dies der Grund sein? –

Antwort

14

Hier ist ein präzises und genaues Beispiel für eine POST-Anforderung ist und das Lesen der Antwort (wenn auch ohne die JSON-Daten Serialisierung). Der einzige Fehler, den ich bisher in Ihrem Code gesehen habe, ist ein inkorrekter ContentType. Außerdem können wir nicht sehen, welche URL Sie versuchen, den Server zu senden (aber es ist unwahrscheinlich, dass er falsch ist). Hoffe es hilft dir weiter zu kommen.

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

Vielen Dank Kent. – BanggaDad

+0

Wenn dies Ihnen geholfen hat, Ihre Frage zu beantworten oder auf andere Weise von Ihrem Gesprächspartner weiterzukommen, dann wählen Sie dies bitte als Ihre akzeptierte Antwort aus. –

-2

Sie haben requestUrl gesetzt "einige URL" zu. Bitte versuchen Sie es mit einer Webadresse, die existiert, zusätzlich zum Ändern des Inhaltstyps auf "application/json".

+1

Ich bin mir ziemlich sicher, dass er die richtige URL in seinem ursprünglichen Code verwendet hat, sonst hätte er statt einer 400 Bad-Anfrage einen DNS-Fehler bekommen. – derpirscher