Простой POST с HttpClient - PullRequest
       8

Простой POST с HttpClient

0 голосов
/ 30 ноября 2018

У меня есть два приложения ASP.NET Core 2.1, и я пытаюсь сделать простой POST вызов из одного приложения в другое, используя HttpClient.

По какой-то причине, когда я использую [FromBody] чтобы получить простой текст, который я пытаюсь получить, я получаю ошибку BadRequest.

Вот мой код отправителя.Во-первых, это то, что в моем методе ConfigureServices.Я использую новую функцию HttpClientFactory в ASP.NET Core 2.1.Я также создал клиентский класс с именем myApiCallerClient, который обрабатывает мои вызовы API:

services.AddHttpClient("myNamedClient", client =>
{
    client.BaseAddress = new Uri("http://localhost:50625/api/");
    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Add("Accept", "application/json");
});

services.AddScoped(x => {
   var httpClientFactory = x.GetRequiredService<System.Net.Http.IHttpClientFactory>();
   var myApiCallerClient = httpClientFactory.CreateClient("myNamedClient");
   return new Clients.ApiCaller.ApiCallerClient(myApiCallerClient);
});

Вот код в myApiCallerClient:

public async Task SayHello()
{
     var response = await _httpClient.PostAsync("test", new StringContent("Saying hello!", System.Text.Encoding.UTF8, "text/plain"));
}

А вот мой код на принимающей стороне, которыйPOST() метод API в TestController:

[HttpPost]
public async Task Post([FromBody]string input)
{
    // Some logic
}

Мой вызов не срабатывает при использовании этого метода, если я использую [FromBody] и получаю ошибку BadRequest на отправителе.Если я использую [FromHeader], мой запрос соответствует этому методу API, но я получаю значение null.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 30 ноября 2018

ASP.NET Core не поддерживает Content-Type из text/plain из коробки, поэтому сервер отклоняет ваш запрос, поскольку он не может быть проанализирован при использовании атрибута [FromBody].

В комментариях вы сказали:

В конечном итоге я не буду отправлять текст.Моя главная проблема заключается в том, что я не использую свой метод API.[...] Как только я убедился, что все работает, я отправлю данные JSON, которые будут десериализованы на принимающей стороне.

Чтобы проверить, связана ли проблема с text/plain Content-Type, вы можете обновить строку PostAsync примерно так:

var response = await _httpClient.PostAsync(
    "test",
    new StringContent("\"Saying hello!\"", System.Text.Encoding.UTF8, "application/json"));

Поскольку application/json является поддерживаемым Content-Type по умолчанию, код вышеиспользует это и переносит значение, которое вы отправляли, с " s, чтобы сделать его действительным значением JSON.

...