Tipo de medio no admitido en httpclient call c #

Oct 04 2020

Estoy tratando de publicar la siguiente solicitud, pero recibo una respuesta de "Tipo de medio no admitido". Estoy configurando Content-Type en application / json. Cualquier ayuda sería apreciada. Y según el comentario a continuación, si cambio el contenido como 'new StringContent (JsonConvert.SerializeObject (root), Encoding.UTF8, "application / json")', obtengo una respuesta de solicitud incorrecta

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;

Respuestas

2 John Oct 04 2020 at 11:17

Con HttpClient, algunos encabezados se cuentan como encabezados de solicitud y otros se cuentan como encabezados de contenido. No estoy seguro de por qué realmente hicieron esta distinción, pero la conclusión es que debe agregar encabezados en el lugar correcto.

En el caso de Content-Type, esto se puede agregar como parte del StringContentconstructor o al StringContentobjeto construido .

Mi enfoque es usar el constructor:

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

O, alternativamente, configúrelo después:

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

Nota: Si su problema persiste después de realizar este cambio, es probable que se trate de un problema del lado del servidor y deberá ponerse en contacto con el responsable de mantenimiento de la API para preguntarle qué está haciendo mal.

JanSkála Oct 04 2020 at 21:02

Prefiero usar envoltorios de terceros como FluentClient Tenga en cuenta que no debe instanciar un nuevo objeto para cada solicitud, O solo lo hizo por el bien de un ejemplo.

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