web-dev-qa-db-fra.com

StringContent vs ObjectContent

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".

16
Lalman

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);
14
Yuval Itzchakov

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");
2
greygreg87

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

0
Denis Yarkovoy