2014-01-11 5 views
7

TL; DR - Wie sende ich eine JSON-Zeichenfolge an einen REST-Host mit einem Auth-Header? Ich habe versucht 3 verschiedene Ansätze gefunden, die mit anonymen Typen arbeiten. Warum kann ich keine anonymen Typen verwenden? Ich muss eine Variable namens "Group-Name" festlegen, und ein Bindestrich ist keine gültige C# -Kennung.Wie sende ich beliebige JSON-Daten mit einem benutzerdefinierten Header an einen REST-Server?

Hintergrund

Ich brauche JSON POST aber bin nicht in der Lage, den Körper und den Inhaltstyp korrekt

Funktion # 1 - mit anonymen Typen Works

Der Inhaltstyp und Daten sind korrekt, aber ich möchte keine anonymen Typen verwenden. Ich möchte eine Zeichenfolge

static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody) 
    { 
     HttpClient client = new HttpClient(); 
     client.BaseAddress = new Uri(restURLBase); 
     client.DefaultRequestHeaders.Add("Auth-Token", AuthToken); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     // StringContent content = new StringContent(postBody); 

     var test1 = "data1"; 
     var test2 = "data2"; 
     var test3 = "data3"; 

     var response = client.PostAsJsonAsync(RESTUrl, new { test1, test2, test3}).Result; // Blocking call! 
     if (!response.IsSuccessStatusCode) 
     { 
      Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase); 
      return; 
     } 
    } 

Ausgabe # 1

Inhaltstyp verwenden und Daten korrekt sind, wenn AnonymousTypes + PostAsJsonAsync verwenden, aber ich will nicht anonyme Typen verwenden.

POST https://api.dynect.net/REST/Zone/ABCqqqqqqqqqqqqYYYYYtes3ss.com HTTP/1.1 
Auth-Token: --- REDACTED ----- 
Accept: application/json 
Content-Type: application/json; charset=utf-8 
Host: api.dynect.net 
Content-Length: 49 
Expect: 100-continue 

{"test1":"data1","test2":"data2","test3":"data3"} 

Funktion # 2 - nicht wie

erwartet

eine Zeichenfolge nehmen und es in ein StringContent Objekt setzen. Dies hat den Nebeneffekt, den Inhaltstyp zu ändern.

static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody) 
    { 
     HttpClient client = new HttpClient(); 
     client.BaseAddress = new Uri(restURLBase); 
     client.DefaultRequestHeaders.Add("Auth-Token", AuthToken); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     StringContent content = new StringContent(postBody); 

     var response = client.PostAsync(RESTUrl, content).Result; // Blocking call! 
     if (!response.IsSuccessStatusCode) 
     { 
      Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase); 
      return; 
     } 
    } 

Ausgabe # 2

Inhaltstyp falsch ist, wenn StringContent + PostAsync mit

POST https://api.dynect.net/REST/Zone/ABCqqqqqqqqqqqqYYYYYtes3ss.com HTTP/1.1 
Auth-Token: ---- REDACTED ------- 
Accept: application/json      // CORRECT 
Content-Type: text/plain; charset=utf-8  // WRONG!!! 
Host: api.dynect.net 
Content-Length: 100 
Expect: 100-continue 

{"rdata" : ["rname" : "dynect.nfp.com", "zone" : "ABCqqqqqqqqqqqqYYYYYtes3ss.com"], "ttl" : "43200"} 
     // ^^ THIS IS CORRECT 

Funktion # 3 - nicht wie erwartet funktionieren

Da ich wissen PostAsJsonAsync setzt den contentType korrekt, können wir diese Methode verwenden. (Funktioniert nicht)

static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody) 
    { 
     HttpClient client = new HttpClient(); 
     client.BaseAddress = new Uri(restURLBase); 
     client.DefaultRequestHeaders.Add("Auth-Token", AuthToken); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     StringContent content = new StringContent(postBody); 

     var response = client.PostAsJsonAsync(RESTUrl, content).Result; // Blocking call! 
     if (!response.IsSuccessStatusCode) 
     { 
      Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase); 
      return; 
     } 
    } 

Ausgabe # 3

Inhaltstyp korrekt ist, POST Körper falsch ist, wenn StringContent + PostAsJsonAsync mit

POST https://api.dynect.net/REST/Zone/ABCqqqqqqqqqqqqYYYYYtes3ss.com HTTP/1.1 
Auth-Token: -- REDACTED --- 
Accept: application/json 
Content-Type: application/json; charset=utf-8 
Host: api.dynect.net 
Content-Length: 74 
Expect: 100-continue 

{"Headers":[{"Key":"Content-Type","Value":["text/plain; charset=utf-8"]}]} 

Frage

Alles, was ich tun möchte, ist, JSON als String oder dynamisches Objekt zu senden, das zur Laufzeit definiert wurde ein Server mit korrektem HTTP-Inhaltstyp und einem speziellen Auth-Token-Header.

Jedes Beispiel, wenn nicht WebAPI, wie Servicestack, oder irgendetwas anderes ist cool.

+0

Können Sie den Fehler anzeigen, den Sie bekommen? –

+0

@ G.Stoynev Kein Fehler per se, aber wie verwende ich "HttpContent" in PostAsync? – LamonteCristo

Antwort

6
/// <summary> 
    /// Creates a new instance of the <see cref="T:System.Net.Http.StringContent"/> class. 
    /// </summary> 
    /// <param name="content">The content used to initialize the <see cref="T:System.Net.Http.StringContent"/>.</param><param name="encoding">The encoding to use for the content.</param><param name="mediaType">The media type to use for the content.</param> 
    [__DynamicallyInvokable] 
    public StringContent(string content, Encoding encoding, string mediaType) 
     : base(StringContent.GetContentByteArray(content, encoding)) 
    { 
     this.Headers.ContentType = new MediaTypeHeaderValue(mediaType == null ? "text/plain" : mediaType) 
     { 
     CharSet = encoding == null ? HttpContent.DefaultStringEncoding.WebName : encoding.WebName 
     }; 
    } 

Es ist Konstruktor StringContent. Sieht so aus, dass Sie entsprechende Codierung und mediaType angeben sollten

2

Sie können keine Instanz von HttpContent direkt einrichten, da es sich um eine abstrakte Klasse handelt. Sie müssen je nach Bedarf eine der Unterklassen verwenden.Wahrscheinlich StringContent, mit dem Sie den String-Wert der Antwort einstellen können, die Kodierung und den Medientyp im Konstruktor: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

Antwort von How do I set up HttpContent for my HttpClient PostAsync second parameter?

+0

Danke, das hat mir geholfen, mit der oben aufgeführten Ausgabe zu kommen. +1 – LamonteCristo

Verwandte Themen