Если я сделал сообщение 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);
Тело:
Я также пробовал его при бессоннице, и там он тоже отлично работает. Может быть, почтальон сделал что-то в своем заголовке, чего я не знаю? Каковы общие различия между почтальоном и HttpClient? Есть ли у кого-нибудь другие предложения о том, что я могу сделать или попытаться найти ошибку?
Редактировать:
Исправлено, добавив / за базовым адресом и удалив его перед вызовом:
client.BaseAddress = new Uri("www.baseaddress.de/");
HttpResponseMessage response = await client.PostAsync($"address", content);
Может кто знает, зачем нужен / в конце базового адреса, почему я не могу поставить его перед вызовом API?
Да. Я только что проверил еще раз.
Используйте генератор кода Postman, чтобы просмотреть необработанный HTTP-запрос и сравнить его с тем, что вы делаете в C#. Убедитесь, что ваш BaseAddress заканчивается косой чертой /
Сейчас я чувствую себя довольно глупо, но после добавления / к базовому адресу и удаления / до адреса он работает. ... Почему я должен добавить косую черту после моего базового адреса и не могу использовать его в методе .PostAsync, например "/ адрес"? Пожалуйста, добавьте свой комментарий в качестве ответа, я приму его. Большое спасибо.
Я нашел причину такого рода проблем, захватив и сравнив запрос почтальона с запросом HttpClient через скрипач. Может быть, это даст вам ключ к разгадке.





Вместо new { id = object.Id }.ToString() нужно сделать
JsonConvert.SerializeObject(new { id = object.Id })
Такой код, как new { id = 77 }.ToString(), производит "{ id = 77 }", а не "{ id: "77" }".
Получил тот же ответ. :(
@Genfood не «исправит» вашу текущую проблему, но вам не нужен .ToString() после .SerializeObject. Он уже возвращает нужную строку json.
@Genfood прямо сейчас похоже на проблему с адресом. Не могли бы вы дважды проверить, что ваш запрос имеет конечный URL-адрес corect. Возможно, вам нужно передать '"/ address"', а не только address в качестве параметра. Кроме того, попробуйте использовать весь URL-адрес в методе .PostAsync: http://address:port/address
Я добавил косую черту сразу после своего базового адреса, и теперь все работает, как сказал @Crowcoder. в моем реальном коде был / до того, как адрес просто подвергся цензуре URL.
Спасибо @Genfood, потратил много времени на прялку колес, пока не наткнулся на ваш комментарий.
У меня была такая же проблема, я изменил адрес с http на https
Сертификат действителен?