Type de support non pris en charge dans l'appel httpclient c #

Oct 04 2020

J'essaie de publier la demande suivante mais j'obtiens une réponse "Type de support non pris en charge". Je règle le Content-Type sur application / json. Toute aide serait appréciée. Et selon le commentaire ci-dessous, si je change le contenu en tant que 'new StringContent (JsonConvert.SerializeObject (root), Encoding.UTF8, "application / json")' alors j'obtiens une mauvaise réponse à la demande

string URL = "https://test.com/api/v2/orders/";  //please note it is dummy api endpoint
            var client = new HttpClient();
            var httpRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = new Uri(URL),
                Headers = {
                            { HttpRequestHeader.Authorization.ToString(), "Bearer ABcdwenlfbl8HY0aGO9Z2NacFj1234" },  //please note it is dummy bearer token
                            { HttpRequestHeader.Accept.ToString(), "application/json;indent=2" },
                            { HttpRequestHeader.ContentType.ToString(), "application/json" }
            },
                //Content =new StringContent(JsonConvert.SerializeObject(root), Encoding.UTF8, "application/json")
                Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(root))
            };
            var response = client.SendAsync(httpRequestMessage).Result;

Réponses

2 John Oct 04 2020 at 11:17

Avec HttpClient, certains en-têtes sont comptés comme des en-têtes de demande et d'autres comme des en-têtes de contenu. Je ne sais pas pourquoi ils ont fait cette distinction, mais l'essentiel est que vous devez ajouter des en-têtes au bon endroit.

Dans le cas de Content-Type, cela peut être ajouté dans le cadre du StringContentconstructeur ou de l' StringContentobjet construit .

Mon approche consiste à utiliser le constructeur:

Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(root), System.Text.Encoding.UTF8, "application/json");

Ou définissez-le ensuite:

Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(root))
Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

Remarque: si votre problème persiste après avoir effectué cette modification, il s'agit probablement d'un problème côté serveur et vous devrez contacter le responsable de l'API pour lui demander ce que vous faites de mal.

JanSkála Oct 04 2020 at 21:02

Je préfère utiliser des wrappers tiers comme FluentClient. Notez que vous ne devez pas créer d'instance d'un nouvel objet pour chaque requête, O ne l'a fait qu'à titre d'exemple.

var client = new FluentClient("https://test.com/api/v2/orders/")
.PostAsync(URI)
.WithBody(root)
.WithBearerAuthentication("ABcdwenlfbl8HY0aGO9Z2NacFj1234");
var response = await client.AsResponse();