Размещение словаря в веб-API в ядре asp.net

У меня есть простой веб-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


person LP13    schedule 29.08.2016    source источник
comment
вы используете какие-нибудь репозитории или модели?   -  person Aravind    schedule 29.08.2016
comment
Я не использую репозиторий или модель. На самом деле это не имеет ничего общего с репозиторием или моделью. API берет пару ключ-значение и что-то с ней делает.   -  person LP13    schedule 29.08.2016


Ответы (1)


Попробуйте объединить два подхода:

[Fact]
public void TestPost3()
{   
    var httpContent = new StringContent("{ \"firstName\": \"foo\" }", Encoding.UTF8, "application/json");

    var client = new HttpClient();
    var result = client.PostAsync("http://localhost:17232/api/Transformation/Post3", httpContent).GetAwaiter().GetResult();
}

[HttpPost]
[ActionName("Post3")]
public void Post3([FromBody]IDictionary<string, string> data)
{
   // do something
}
person adem caglin    schedule 29.08.2016