2016-08-29 3 views
2

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

+0

Вы используете какие-либо репозитории или модели? – Aravind

+0

Я не использую репозиторий или модель. На самом деле это не имеет никакого отношения к репозиторию или модели. Api берет ключ-значение и делает что-то с ним. – LP13

ответ

5

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

[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 
}