反序列化HttpResponseMessage



我有一个API(asp-net-core3.1(和一个web应用程序(asp-net-BlazorWebAssembly(。在我的API中,我有一个具有以下POST方法的CustomerController:

[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应用程序中,我有一个类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请求(比如通过Postman(,那么响应包含(除其他外(主体,这是我的数据库对象的jsonized版本。我能用JsonSerializer在我的Web应用程序中捕获该主体并像使用FindOneByIdAsync方法那样返回它吗?或者,在API中,我是否可以在响应头中创建一个仅包含Id的新头,该Id是数据库为新对象创建的,并在我的web应用程序post方法中从响应中获取?

使用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

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

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

随意制作一个整洁的一行。

我的数据服务:

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);
}
...

相关内容

  • 没有找到相关文章

最新更新