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
erwarteteine 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.
Können Sie den Fehler anzeigen, den Sie bekommen? –
@ G.Stoynev Kein Fehler per se, aber wie verwende ich "HttpContent" in PostAsync? – LamonteCristo