首页 > 解决方案 > 如何处理对成功和失败有不同响应类型的 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 响应并分配给不同类型的对象?谢谢。

标签: c#.netasp.net-web-apirestsharpwebapi

解决方案


的,应该手动解析响应。

假设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
    } 

注意:使用该过程作为扩展取决于您的案例中响应模式的常见程度。


推荐阅读