J'utilise HttpClient de System.Net.Http pour appeler une API REST avec "POST" en utilisant le code suivant:
using (HttpRequestMessage requestMessage = new HttpRequestMessage(
HttpMethod.Post, new Uri(request)) { })
{
response = await httpClient.PostAsync(request, objectContent);
}
Le "objectContent" est actuellement ceci -
objectContent = new ObjectContent(jsonContent.GetType(),
jsonContent,
new JsonMediaTypeFormatter());
Je me demandais quelle différence cela faisait si c'était un StringContent plutôt qu'un ObjectContent comme ça?
objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Les deux fonctionnent bien. Parce que c'est JSON, j'ai tendance à supposer que StringContent aurait du sens. Mais quand ObjectContent doit-il être utilisé parce que pratiquement tout le contenu envoyé est une "chaîne".
Je me demandais quelle différence cela faisait si c'était un StringContent plutôt qu'un ObjectContent comme ça?
Dans votre exemple, il n'y aura aucune différence. ObjectContent
permet simplement d'envoyer une gamme "plus large" de types via HttpClient
, tandis que StringContent
est plus étroite pour les valeurs string
uniquement, telles que JSON.
StringContent
est un wrapper mince autour de ByteArrayContent
, et stocke en fait la valeur passée sous la forme d'un byte[]
. Vous obtenez simplement l'avantage de ne pas avoir à transformer votre string
dans les deux sens.
Modifier:
Étant donné que vous publiez un JSON, vous pouvez même le rendre moins détaillé en utilisant HttpClientExtensions.PostAsJsonAsync<T>
:
await httpClient.PostAsJsonAsync(url, json);
Si quelqu'un cherche comment envoyer une demande par PostAsync dans .NET Core 2.1: Je n'ai pas trouvé la méthode PostAsJsonAsync dans HttpClient, mais votre solution avec le paramètre:
objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
"faire le travail" parfaitement aussi dans .NET Core.
Éditer:
De plus, si vous souhaitez ajouter votre propre en-tête, vous pouvez taper:
objectContent.Headers.Add("Your header", "Value");
ObjectContent est utilisé pour formater des types Mime plus complexes à l'aide de formateurs intégrés ou personnalisés. Il est correct d'utiliser ObjectContent pour une chaîne simple également, cela ne fait pas beaucoup de différence, sauf pour les performances qui (à mon humble avis et non vérifiées) peuvent être meilleures avec StringContent, car il peut avoir été optimisé spécifiquement pour les chaînes