Comment puis-je envoyer arbitraire de données JSON, avec un en-tête personnalisé, pour un REPOS serveur?
-
22-12-2019 - |
Question
TL;DR-Comment puis-je envoyer une chaîne JSON à un RESTE d'accueil avec un en-tête d'authentification?J'ai essayé 3 approches différentes trouvé un qui fonctionne avec les types anonymes.Pourquoi ne puis-je pas utiliser les types anonymes?J'ai besoin de définir une variable appelée "Groupe-Nom", et un trait d'union n'est pas valide en C# identificateur.
Arrière-plan
J'ai besoin de mettre JSON, mais je suis incapable d'obtenir le corps et le type de contenu correct
La fonction n ° 1 - Fonctionne avec les types anonymes
Le type de contenu et de données est correct, mais je ne veux pas utiliser les types anonymes.Je veux utiliser une chaîne de caractères
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;
}
}
Sortie n ° 1
Type de contenu et de données est correct lors de l'utilisation de AnonymousTypes + PostAsJsonAsync, mais je ne veux pas utiliser les types anonymes.
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"}
La fonction n ° 2 - Ne fonctionne pas comme prévu
Prendre une corde et le mettre dans un StringContent objet.Cela a un effet secondaire de changer le type de contenu.
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;
}
}
Sortie n ° 2
Type de contenu est incorrect lors de l'utilisation de 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
Fonction n ° 3 - Ne pas fonctionner comme prévu
Depuis que je sais PostAsJsonAsync
définit le contentType correctement, permet d'utiliser cette méthode.(ne fonctionne pas)
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;
}
}
Sortie n ° 3
Type de contenu est correct, corps POST est erroné lors de l'utilisation de 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"]}]}
Question
Tout ce que je veux faire est d'envoyer JSON comme une chaîne de caractères, ou de la dynamique de l'objet défini au moment de l'exécution, d'un serveur HTTP de type de contenu est correct, et avec un spécial "Auth-Jeton" en-tête.
Un exemple, si vous n'utilisez pas WebAPI, comme servicestack, ou autre chose c'est cool.
La solution
/// <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
};
}
Il est constructeur de StringContent.Ressemble que vous devez spécifier l'Encodage approprié et mediaType
Autres conseils
Vous ne pouvez pas directement l'installation d'une instance de HttpContent, parce que c'est une classe abstraite.Vous devez utiliser l'un des sous-classes en fonction de votre besoin.Le plus probable StringContent, qui vous permet de définir la chaîne de valeur de la réponse, le codage, et le type de support dans le constructeur: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx
Réponse de Comment puis-je configurer HttpContent pour mon HttpClient PostAsync deuxième paramètre?