反序列化 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
我有一个 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