Tengo éxito usando Postman haciendo una publicación para autenticación, sin embargo, parece que no puedo hacer que funcione desde C #, obteniendo un 401. La contraseña y el nombre de usuario se verifican igual que en Postman. ¿Algunas ideas? Aquí está mi código:

            var url = AppConstants.ApiLoginUrl;
            var uriRequest = new Uri(url);
            string httpResponseBody;

            using (var httpClient = new Windows.Web.Http.HttpClient())
            { 
              var content = new HttpStringContent(string.Format("username={0}&password={1}", email, password), Windows.Storage.Streams.UnicodeEncoding.Utf8, "application/x-www-form-urlencoded");
                try
                {
                    var httpResponse = await httpClient.PostAsync(uriRequest, content); 

... }

Aquí están las configuraciones en Postman para el encabezado y el cuerpo.

enter image description here

enter image description here

Ahora usando este código para el parámetro de contenido:

                var content = new HttpFormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("username", email),
                    new KeyValuePair<string, string>("password", password)
                });

En una mirada más cercana, parece que el nombre de usuario está codificado en Fiddler tanto para el Cartero como para las solicitudes de código. Entonces, mi teoría sobre el uso de un nombre de usuario codificado no es del todo correcta. Aquí en las instantáneas de las solicitudes de Fiddler ... ¿Alguna sugerencia / idea?

Cabeceras de cartero:

Postman headers

Encabezados de código: Encabezados de código

Raw View Postman * que muestra el campo de nombre de usuario codificado: Vista en bruto revisada

Código de vista sin procesar Raw code

2
Russ Fustino 25 feb. 2018 a las 22:06

4 respuestas

La mejor respuesta

Tengo entendido que para las aplicaciones UWP, Windows.Web.Http.HttpClient () es la forma recomendada de hacer esto, además de asegurarse de que sus URL no tengan errores tipográficos. :)

         var url = AppConstants.ApiLoginUrl;
            var uriRequest = new Uri(url);

            var content = new HttpFormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("username", email),
                new KeyValuePair<string, string>("password", password)
            });

            using (var httpClient = new Windows.Web.Http.HttpClient())
            {
                try
                {
                    var httpResponse = await httpClient.PostAsync(uriRequest, content); 
3
Russ Fustino 27 feb. 2018 a las 15:19

Estoy usando esta función para enviar solicitudes de publicación con parámetros, donde Dictionary<string, string> data como valor clave según lo esperado por el servicio web

public static T PostCast<T>(string url, Dictionary<string, string> data)
{
    using (HttpClient httpClient = new HttpClient())
    {
        var response = httpClient.PostAsync(url, new FormUrlEncodedContent(data)).Result;
        return response.Content.ReadAsAsync<T>().Result;
    }
}

Espero que :) ayude

1
Mohammad Ali 25 feb. 2018 a las 20:57

Tuve el mismo problema y lo solucioné eliminando el "/" final de la URL en la que HttpClient estaba publicando.

0
Rocco Smit 25 oct. 2018 a las 10:20

Intenta cambiar tu contenido a lo siguiente

var content = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("username", email),
    new KeyValuePair<string, string>("password", password)
});
1
khoroshevj 25 feb. 2018 a las 20:20