如何从ReadAsStringAsync响应中正确获取Blazor WASM的API返回数据?
问题:Blazor WASM中无法正确反序列化API响应数据
现有实现
NET8 Blazor WASM客户端在OnInitializedAsync方法中调用API的代码如下:
HttpResponseMessage response = await Http.GetAsync("https://localhost:7094/api/MyResource/94d0e5ca-2be7-42f7-94dc-13955c11595c"); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine($"RESPONSE: {responseBody}"); var payload = JsonSerializer.Deserialize<MyClass>(responseBody); var json = JsonSerializer.Serialize(payload); Console.WriteLine($"PAYLOAD: {json}");
API响应结构
responseBody返回的JSON包含额外的包装层,实际业务数据位于result.content节点内:
{ "creationOptions": 0, "id": 226, "isCanceled": false, "isCompleted": true, "isCompletedSuccessfully": true, "isFaulted": false, "result": { "content": { <实际业务数据> }, "links": { <HATEOAS链接> } }, "status": 5 }
问题现象
直接将responseBody反序列化为MyClass时得到null,原因是JSON结构包含额外的HTTP请求结果包装层,与MyClass的字段不匹配。尝试使用Http.GetFromJsonAsync<Payload<MyClass>>调用,返回结果为{"content": null, "links": null},怀疑存在时序问题。
需求
寻求从该JSON响应中提取实际有效业务数据的最优方案。
最终修复方案
通过修改API端的响应输出逻辑,彻底解决客户端反序列化问题:
- 将API的返回类型从
Task改为IActionResult - 移除不必要的响应包装层
修改完成后,客户端可直接通过以下代码获取并反序列化数据:
var myEntities = await Http.GetFromJsonAsync<IEnumerable<FabricageSoort>>("https://localhost:7094/api/FabricageSoort/");
内容的提问来源于stack exchange,提问作者kbd
相关产品推荐
相关产品推荐

