c# - 如何处理对成功和失败有不同响应类型的 WEB API?
问题描述
我正在开发一个使用 .NET Framework 制作的 WEB API 应用程序。现在,我正在与供应商合作,帮助他们将他们的 WEB API 与我们的系统集成。他们的最新更改之一破坏了我的代码。由于我使用的是 RestSharp 库,因此我希望响应始终对应于特定类型的对象,独立于他们一方的成功或失败。
IRestResponse<T> response = await restClient.ExecuteAsync<T>(request);
如果响应成功,他们将发送这样的 json 响应
{message:"", jobNr:"2312312", status:"1"}
然后他们更改了代码,因此如果任何请求输入错误,他们将发送错误列表,因此响应将如下所示:
[{code:100, message:"contact phone is wrong"},{code:101, message:"the email is not provided"}]
我不喜欢这种方法,因为我认为他们应该对这样的错误做出回应:
{errorMessages:[{code:100, message:"contact phone is wrong"},{code:101, message:"the email is not provided"}]}
但因为它不在我手中。我应该如何处理?只需解析 json 响应并分配给不同类型的对象?谢谢。
解决方案
是的,应该手动解析响应。
假设RestSharp仍然负责并且原始 API 返回标题为BadRequest
状态代码的错误,下面的扩展尝试将内容反序列化为错误数组(类型由代码和消息组成,就像问题中提到的那样)。
public static Error[] AsErrors(this IRestResponse response)
{
var empty = new Error[] { };
try
{
return response.StatusCode == System.Net.HttpStatusCode.BadRequest
? JsonSerializer.Deserialize<Error[]>(response.Content)
: empty;
}
catch (JsonException)
{
return empty;
}
}
考虑到这NormalContent
是您真正期望的响应,用法将是:
// after creating client and request ...
var response = client.Execute<NormalContent>(request);
var errors = response.AsErrors();
if (errors.Any())
{
//Deal with errors
}
else
{
//response.Data gets populated with RealResult
}
注意:使用该过程作为扩展取决于您的案例中响应模式的常见程度。
推荐阅读
- python - 为什么我需要在 render() 中指定 HTML 文件
- python - 遍历 200 个数据集
- windows - 如何解决 Windows 10 中的 URL 无法识别错误?
- python - 为什么第 18 行的 if 语句不能防止错误“列表索引超出范围”
- java - 使用 java 从目录中选择特定文件
- javascript - javascript递归函数给出错误
- android - 损坏的序列化解析结果。使用firebase ui依赖时找不到选定的模块
- python - ValueError: too many values to unpack (expected 2) ,当我尝试从正则表达式模式中仅提取 2 个子字符串时
- laravel - Laravel Eager Load 在条件关系中变为空
- swift - 使用 Github Actions 运行 firebase 模拟器 - CI iOS 项目