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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist Konstruktor von StringContent. Sieht aus wie, dass Sie sollten geben Sie geeignete Codierung und mediaType
Können Sie nicht direkt setup eine Instanz von HttpContent, denn es ist eine abstrakte Klasse. Sie müssen verwenden Sie eine der sub-Klassen, je nach Ihrem Bedarf. Wahrscheinlich StringContent, können Sie den string-Wert der Reaktion, die Codierung und die Medien geben Sie im Konstruktor: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx
Antwort von Wie richte ich HttpContent für meine HttpClient PostAsync zweiten parameter?