У меня есть простой веб-api, разработанный с использованием Asp.Net Core
, и я пытаюсь отправить пару ключ-значение с помощью HttpClient. Я попробовал два подхода.Публикация словаря на веб-api в asp.net core
первый подход
[Route("api/[controller]/[action]")]
public class TransformationController : Controller
{
private IServiceResolver _serviceResolver;
public TransformationController(IServiceResolver serviceResolver)
{
_serviceResolver = serviceResolver;
}
[HttpPost]
[ActionName("Post1")]
public void Post1([FromBody]Dictionary<string, string> data)
{
// do something
}
}
, а затем я отправляю его, как показано ниже
[Fact]
public void TestPost1()
{
var content = new Dictionary<string, string>();
content.Add("firstname", "foo");
var httpContent = new FormUrlEncodedContent(content);
var client = new HttpClient();
var result = client.PostAsync("http://localhost:17232/api/Transformation/Post1", httpContent).GetAwaiter().GetResult();
}
, но я получаю Unsupported Media Type
ошибку
{StatusCode: 415, ReasonPhrase: ' Неподдерживаемый тип носителя ', Версия: 1.1, Conte нт: System.Net.Http.StreamContent, заголовки: {Дата: Пн, 29 августа 2016 19:44:44 GMT Сервер: Kestrel X-исходников,:?? = UTF-8 B QzpccmVwb3NcY3ItbWV0YXRhc2tlclxzcmNcSW5ib3VuZEludGVncmF0aW9uXFRyYW5zZm9ybWF0aW9ucy5BcGlcYXBpXFRyYW5zZm9ybWF0aW9uXFRyYW5zZm9ybWF0aW9uMQ == = Х- Powered-By: ASP.NET Content-Length: 0}}
подход 2
Поскольку я не могу определить тип содержимого и кодировку в FormUrlEncodedContent
я изменил подпись метода пост, а теперь взять JSon string в качестве параметра. Идея заключается в де-сериализации строки в словаре.
[HttpPost]
[ActionName("Post2")]
public void Post2([FromBody]string data)
{
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(data);
// do something here
}
, а затем я отправляю строку, как показано ниже
[Fact]
public void TestPost2()
{
var httpContent = new StringContent("{ \"firstName\": \"foo\" }", Encoding.UTF8, "application/json");
var client = new HttpClient();
var result = client.PostAsync("http://localhost:17232/api/Transformation/Post2", httpContent).GetAwaiter().GetResult();
}
однако, когда я отладки тест; параметр data
в методе Post2 равен null.
Я не уверен, что мне не хватает здесь в обоих подходах? Может кто-то пожалуйста, помогите
Update1
Если я использую Почтальон для отправки данных, то его работу. Таким образом, для подхода 1 я могу разместить необработанные данные
{
"firstname": "foo"
}
и Approach2 сообщение необработанные данные
"{\"firstname\": \"foo\"}"
howevere те же данные, не работает, когда я использую HttpClient
Вы используете какие-либо репозитории или модели? – Aravind
Я не использую репозиторий или модель. На самом деле это не имеет никакого отношения к репозиторию или модели. Api берет ключ-значение и делает что-то с ним. – LP13