Tipo di supporto non supportato nella chiamata httpclient c #

Oct 04 2020

Sto tentando di inviare la seguente richiesta ma ricevo una risposta "Tipo di supporto non supportato". Sto impostando Content-Type su application / json. Qualsiasi aiuto sarebbe apprezzato. E come da commento qui sotto, se cambio il contenuto come 'new StringContent (JsonConvert.SerializeObject (root), Encoding.UTF8, "application / json")', ottengo una risposta alla richiesta non valida

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;

Risposte

2 John Oct 04 2020 at 11:17

Con HttpClientalcune intestazioni vengono conteggiate come intestazioni di richiesta e altre come intestazioni di contenuto. Non sono sicuro del motivo per cui abbiano fatto questa distinzione, ma la linea di fondo è che devi aggiungere le intestazioni nel posto corretto.

Nel caso di Content-Type, questo può essere aggiunto come parte del StringContentcostruttore o StringContentall'oggetto costruito .

Il mio approccio consiste nell'usare il costruttore:

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

O in alternativa impostarlo in seguito:

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

Nota: se il problema persiste dopo aver apportato questa modifica, è probabile che si tratti di un problema lato server e dovrai contattare il manutentore dell'API per chiedere cosa stai facendo di sbagliato.

JanSkála Oct 04 2020 at 21:02

Preferisco usare alcuni wrapper di terze parti come FluentClient Nota che non dovresti istanziare un nuovo oggetto per ogni richiesta, O lo hai fatto solo per il gusto di un esempio.

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