反序列化 HttpResponseMessage

Deserialize HttpResponseMessage

我有一个 API (asp net core 3.1) 和一个网络应用程序 (asp net Blazor WebAssembly)。 在我的 API 中,我有一个 CustomerController,其方法如下 POST:

    [HttpPost]
    public async
        Task<ActionResult>
        CreateOrderAsync(OrderDto orderDto)
    {
        orderDto.IdOrder =
            await repository
            .CreateOrderAsync(mapper.Map<Order>(orderDto));
        return CreatedAtRoute(nameof(GetOrderByIdAsync),
            new { idOrder = orderDto.IdOrder }, orderDto);
    }

在我的 Web 应用程序中,我有 class DataServiceHelper,我在 Web 应用程序的实际数据服务中使用它。这里我有 POST 和 GET 等方法:

  ...
  static public async Task PostAsync(HttpClient httpClient, string endpoint, T item)
  {
     await httpClient.PostAsJsonAsync(endpoint, item);
  }
  static public async Task<T> FindOneByIdAsync(HttpClient httpClient, string endpoint)
  {
      return await JsonSerializer.DeserializeAsync<T>
         (await httpClient.GetStreamAsync(endpoint), new JsonSerializerOptions()
         { ropertyNameCaseInsensitive = true });
  }
  ...

如果我向 API 发送 POST 请求(比如通过邮递员),响应包含(除其他外)body,这是我的数据库的 json 化版本 object。我能以某种方式在我的 Web 应用程序中使用 JsonSerializer 捕获 body 并且 return 它就像我使用 FindOneByIdAsync 方法一样吗? 或者,在 API 中,我能否在响应 header 中创建一个新的 header,它只包含数据库为新的 object 创建的 ID,然后捕获在我的网络应用程序 post 响应中的方法?

可能有点麻烦,但这很有效:

static public async Task<T>PostAndListenAsync(HttpClient httpClient, string endpoint, T item)
{            
    var content = await httpClient.PostAsJsonAsync(endpoint, item);
    var stream = await content.Content.ReadAsStreamAsync();
    T t = await JsonSerializer.DeserializeAsync<T>(stream, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
    return t;
}

随意整理一下one-liner。

我的数据服务:

public async Task<OrderDto> PostOrderAsync(OrderDto orderDto)
{
    return await DataServiceHelper<OrderDto>.PostAndListenAsync(httpClient, "/Orders", orderDto);
}

在剃须刀中:

...
private async Task CreateNewOrder()
{
        OrderDto orderDto = await dataService.PostOrderAsync(newOrder);
}
...

使用System.Net.Http.Json。示例:

Task<O> CallGet<O>(string requestUrl) => http.GetFromJsonAsync<O>(requestUrl);

async Task<O> CallPost<I, O>(string requestUrl, I input)
{
    using var response = await http.PostAsJsonAsync(requestUrl, input);
    return await response.Content.ReadFromJsonAsync<O>();
}

有关更多方法和重载,请参阅文档。

它也可以作为 nuget 使用:https://www.nuget.org/packages/System.Net.Http.Json