У меня есть простой веб-API, разработанный с использованием Asp.Net Core
, и я пытаюсь опубликовать пару ключ-значение с помощью HttpClient. Я пробовал два подхода.
Первый подход
[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: 'Unsupported Media Type', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: {Date: Mon, 29 Aug 2016 19:44:44 GMT Сервер: Kestrel X-SourceFiles: ? = UTF-8 В QzpccmVwb3NcY3ItbWV0YXRhc2tlclxzcmNcSW5ib3VuZEludGVncmF0aW9uXFRyYW5zZm9ybWF0aW9ucy5BcGlcYXBpXFRyYW5zZm9ybWF0aW9uXFRyYW5zZm9ybWF0aW9uMQ == = X-Powered-By:??? ASP.NET Content-Length: 0}}
Подход 2
Поскольку я не могу указать тип содержимого и кодировку в FormUrlEncodedContent
, я изменил подпись метода публикации, и теперь он принимает строку Json в качестве параметра. Идея состоит в том, чтобы десериализовать строку в словарь.
[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 равен нулю.
Я не уверен, что мне здесь не хватает в обоих подходах? Может кто-нибудь, пожалуйста, помогите
Update1
Если я использую POSTMAN для публикации данных, значит, он работает. Итак, для подхода 1 я могу публиковать необработанные данные как
{
"firstname": "foo"
}
и подход 2 публикует необработанные данные как
"{\"firstname\": \"foo\"}"
однако те же данные не работают, когда я использую HttpClient