Wie versende ich eine beliebige JSON-Daten, mit einem benutzerdefinierten header -, einen REST-server?

TL;DR -- Wie sende ich einen JSON-string an eine REST-host mit einem auth-header? Ich habe versucht, 3 verschiedene Ansätze gefunden die funktioniert mit anonymen Typen. Warum kann ich nicht mit anonymen Typen? Ich brauche, um eine variable mit dem Namen "Group-Name", und ein Bindestrich ist kein gültiges C# - Bezeichner.

Hintergrund

Muss ich POST JSON, bin aber nicht in der Lage, den Körper zu bekommen und den content-type richtig

Funktion #1 - Arbeiten mit anonymen Typen

Den content-type und Daten ist richtig, aber ich will nicht von anonymen Typen. Ich möchte einen string

  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

Content-type und Daten ist korrekt, wenn mit AnonymousTypes + PostAsJsonAsync, aber ich will nicht von anonymen Typen.

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 - funktioniert nicht wie erwartet,

Nehmen Sie eine Schnur und legen Sie Sie in eine StringContent Objekt. Dies hat eine Nebenwirkung, die das ändern des content-type.

  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

Content-type ist falsch, wenn mit StringContent + PostAsync

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 - funktioniert nicht wie erwartet,

Da ich weiß PostAsJsonAsync setzt den contentType richtig, können Verwendung dieser Methode. (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

Content-Typ korrekt ist, POST-body ist falsch, wenn mit StringContent + PostAsJsonAsync

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 will zu tun ist, senden JSON als string oder dynamisches Objekt definiert, die zur Laufzeit auf einen server mit HTTP-content-type korrekt, und mit einem speziellen " Auth-Token header.

Jedem Beispiel, wenn nicht mit WebAPI, wie servicestack, oder sonst etwas kühl ist.

  • Können Sie die Fehler sind Sie immer?
  • Kein Fehler per se, aber wie verwende ich "HttpContent" in PostAsync?
InformationsquelleAutor Christopher | 2014-01-11
Schreibe einen Kommentar