Я успешно использую почтальон, делающий сообщение для аутентификации, но не могу заставить его работать из C #, получая 401. Пароль и имя пользователя проверяются так же, как в почтальоне. Любые идеи? Вот мой код:

            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); 

...}

Вот настройки в Почтальоне для заголовка и тела.

enter image description here

enter image description here

Теперь используя этот код для параметра содержимого:

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

При ближайшем рассмотрении кажется, что имя пользователя закодировано в Fiddler как для почтальона, так и для запросов кода. Итак, моя теория об использовании закодированного имени пользователя не совсем верна. Здесь на снимках запросов от Fiddler ... Есть еще предложения / идеи?

Заголовки почтальона:

Postman headers

Заголовки кода: Заголовки кода

Raw View Postman * показывает закодированное поле имени пользователя: Необработанное представление исправлено

Необработанный вид кода Необработанный код

2
Russ Fustino 25 Фев 2018 в 22:06

4 ответа

Лучший ответ

Насколько я понимаю, для приложений UWP Windows.Web.Http.HttpClient () является рекомендуемым способом сделать это, а также убедиться, что ваши URL не содержат опечаток. :)

         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 Фев 2018 в 15:19

Я использую эту функцию для отправки запросов с параметрами, где Dictionary<string, string> data в качестве значения ключа, как и ожидалось веб-службой

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;
    }
}

Надеюсь, это поможет :)

1
Mohammad Ali 25 Фев 2018 в 20:57

У меня была та же проблема, и я исправил ее, удалив завершающий символ "/" из URL, на который отправлял HttpClient.

0
Rocco Smit 25 Окт 2018 в 10:20

Попробуйте изменить свой контент на следующее

var content = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("username", email),
    new KeyValuePair<string, string>("password", password)
});
1
khoroshevj 25 Фев 2018 в 20:20