Сообщение Http работает в Postman, но не в C# с HttpClient

Если я сделал сообщение Http (Https) через Postman, все работает нормально. Но если я попробую тот же пост с HttpClient в ядре .NET, это не сработает, похоже, что авторизация не удалась или что-то в этом роде, потому что response.StatusCode в порядке, но если я прочитаю строку содержимого, я получаю HTML-страницу с 404 и ее спрашивая, хочу ли я войти в систему.

Конечно, я уже проверил очевидные вещи, такие как адрес, и пробовал разные токены (они всегда работали в почтальоне). Я также пробовал разные варианты добавления токена на предъявителя:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

Это код на данный момент:

client.BaseAddress = new Uri("www.baseaddress.de");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var content = new StringContent(JsonConvert.SerializeObject(new { id = object.Id }), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"/address", content);

Заголовки почтальона: Сообщение Http работает в Postman, но не в C# с HttpClient

Тело:

Сообщение Http работает в Postman, но не в C# с HttpClient

Я также пробовал его при бессоннице, и там он тоже отлично работает. Может быть, почтальон сделал что-то в своем заголовке, чего я не знаю? Каковы общие различия между почтальоном и HttpClient? Есть ли у кого-нибудь другие предложения о том, что я могу сделать или попытаться найти ошибку?

Редактировать:

Исправлено, добавив / за базовым адресом и удалив его перед вызовом:

client.BaseAddress = new Uri("www.baseaddress.de/");
HttpResponseMessage response = await client.PostAsync($"address", content);

Может кто знает, зачем нужен / в конце базового адреса, почему я не могу поставить его перед вызовом API?

Сертификат действителен?

Mahdi 04.04.2018 12:17

Да. Я только что проверил еще раз.

Genfood 04.04.2018 12:20

Используйте генератор кода Postman, чтобы просмотреть необработанный HTTP-запрос и сравнить его с тем, что вы делаете в C#. Убедитесь, что ваш BaseAddress заканчивается косой чертой /

Crowcoder 04.04.2018 12:46

Сейчас я чувствую себя довольно глупо, но после добавления / к базовому адресу и удаления / до адреса он работает. ... Почему я должен добавить косую черту после моего базового адреса и не могу использовать его в методе .PostAsync, например "/ адрес"? Пожалуйста, добавьте свой комментарий в качестве ответа, я приму его. Большое спасибо.

Genfood 04.04.2018 13:12

Я нашел причину такого рода проблем, захватив и сравнив запрос почтальона с запросом HttpClient через скрипач. Может быть, это даст вам ключ к разгадке.

Victor SDK 07.05.2019 19:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
5
7 710
2

Ответы 2

Вместо new { id = object.Id }.ToString() нужно сделать

JsonConvert.SerializeObject(new { id = object.Id })

Такой код, как new { id = 77 }.ToString(), производит "{ id = 77 }", а не "{ id: "77" }".

Получил тот же ответ. :(

Genfood 04.04.2018 12:29

@Genfood не «исправит» вашу текущую проблему, но вам не нужен .ToString() после .SerializeObject. Он уже возвращает нужную строку json.

Set 04.04.2018 12:38

@Genfood прямо сейчас похоже на проблему с адресом. Не могли бы вы дважды проверить, что ваш запрос имеет конечный URL-адрес corect. Возможно, вам нужно передать '"/ address"', а не только address в качестве параметра. Кроме того, попробуйте использовать весь URL-адрес в методе .PostAsync: http://address:port/address

Set 04.04.2018 12:48

Я добавил косую черту сразу после своего базового адреса, и теперь все работает, как сказал @Crowcoder. в моем реальном коде был / до того, как адрес просто подвергся цензуре URL.

Genfood 04.04.2018 13:14

Спасибо @Genfood, потратил много времени на прялку колес, пока не наткнулся на ваш комментарий.

DannyC 09.05.2019 19:38

У меня была такая же проблема, я изменил адрес с http на https

Другие вопросы по теме