web-dev-qa-db-fra.com

C # Ajouter un en-tête Accept à HttpClient

Quelle est la différence entre ces deux appels? Mon objectif final est d'avoir Accept: application/json envoyé sur le câble, pour ne pas être ajouté à un ensemble par défaut d'autres types MIME.

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");

vs.

client.DefaultRequestHeaders
  .Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));

Mon CLR est .NET Core 2.0.

Renifler le fil ne révèle aucune différence:

# just .Add("Accept"...
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]

# with MediaTypeWithQualityHeaderValue
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]

Donc, en dehors de la dénomination bizarre de ce type, rien d'autre à gagner ici, non?

19
evilSnobu

Il n'y a pas de différence.

DefaultRequestHeaders.Accept est une collection de type chaîne, où vous pouvez ajouter votre en-tête pour accepter l'utilisation de la nouvelle instance de MediaTypeWithQualityHeaderValue.

client.DefaultRequestHeaders est un dictionnaire qui accepte la clé et la valeur de l'en-tête de la demande et fait correspondre les résultats en fonction d'eux.

DefaultRequestHeaders

a des surcharges.

La seule chose qui diffère entre eux, c'est le fait que DefaultRequestHeaders.Accept vous demandera d'initialiser une nouvelle instance de la classe MediaTypeWithQualityHeaderValue, résultant en un autre type de référence dans le tas, tandis que client.DefaultRequestHeaders ajoutera les données au dictionnaire, supprimant le coût des ressources et la nécessité d'initialiser une nouvelle instance.

C'est vraiment à l'utilisateur de savoir comment et quoi utiliser.

14
Barr J

Il n'y a aucune différence dans le résultat final, tant que les noms et les valeurs sont corrects.

La norme HTTP spécifie que certains en-têtes ont un facteur de qualité , d'où le nom MediaTypeWithQualityHeaderValue . Il s'agit d'une valeur d'en-tête MediaType qui peut avoir un facteur de qualité. Vous pouvez transmettre le facteur de qualité si vous utilisez le constructeur MediaTypeWithQualityHeaderValue (String, Double) constructeur

La section d'en-tête Accept dans la norme montre plusieurs exemples qui utilisent le facteur de qualité. Par exemple,

L'exemple

   Accept: audio/*; q=0.2, audio/basic

DEVRAIT être interprété comme "Je préfère l'audio/de base, mais envoyez-moi n'importe quel type audio s'il est le meilleur disponible après une baisse de 80% de la qualité."

Vous pourriez écrire ça avec

var requestAccepts=client.DefaultRequestHeaders.Accept;
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/*",0.2));
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/basic"));

Ou vous pouvez entrer la valeur d'en-tête brute avec:

client.DefaultRequestHeaders.Add("Accept", "audio/*; q=0.2, audio/basic");
4

Je ne pense pas qu'il y ait une différence, c'est juste un moyen plus simple d'ajouter des en-têtes standard via des propriétés comme Accept, également pratique pour ajouter des en-têtes personnalisés via la méthode Add.

0
AJ -