API响应Http状态代码和自定义错误代码映射

问题描述 投票:1回答:1

我如何存储http状态代码和错误代码的映射。首先,我正在处理的状态代码和错误代码与twitter Error codes类似。

现在的问题是,对于单个http状态代码,我是否有多个错误代码(如果是twitter,错误代码3,44,215,323,324,325,407映射到http状态代码400),如何在我的代码中存储此值。我使用Dictionary<int, List<int>>还是有其他方法可以使用?]

我将在异常中设置错误代码。异常过滤器将解析错误代码并设置适当的http状态代码,然后将API响应发送回去。

异常类

public class APIException : Exception
{
    public int ErrorCode { get; set; }


    public APIException(int errorCode, string message) : base(message)
    {
        ErrorCode = errorCode;
    }
}

异常过滤器代码段

var apiException = actionExecutedContext.Exception as APIException;

int statusCode = GetHttpStatusCode(apiException.ErrorCode)

var response = new HttpResponseMessage((HttpStatusCode)(statusCode));

var apiResult = new APIResult(apiException.ErrorCode, apiException.Message);

response.Content = new ObjectContent<APIResult>(apiResult, new JsonMediaTypeFormatter(), "application/json");

actionExecutedContext.Response = response;

现在的问题是关于GetHttpStatusCode()功能的实现。目前,我正在考虑使用Dictionary<int, List<int>>存储映射。通过搜索值(错误代码)来获取键(httpStatusCode)。

我可以拥有一个简单的字典,其中错误代码是键,而http状态代码是值。但是,如果我必须查看特定状态码的所有错误代码,此列表将变得庞大且可读性将很困难。

c# api exception http-status-codes error-code
1个回答
1
投票

坦率地说,带有平面词典的那个

[...]列表将变得庞大,如果我必须查看特定状态码的所有错误码,则可读性将很困难。

不是使代码过于复杂且性能降低的很好的借口。尽管Dictionary<int, List<int>>的可读性可能会好一些,但是代码本身(并且应该是重要的代码)的可读性会受到影响。恕我直言,这是次优代码结构的症状。

使用平面字典,查找变得简单

int GetHttpStatus(int errorCode)
{
   return errorCodeMappings[errorCode]; 
}

而且由于键在字典中不能多次出现,所以不可能将错误代码相乘。

[ 。)

如果将其包装在某些Dictionary<int, List<int>>类中,则可以将构造函数定义为

StatusCodeMapper

并且将public ErrorCodeMapper(Dictionary<int, List<int>> reverseMappings)
{
    // Convert mappings to a more efficient format
    this.mappings = reverseMappings.SelectMany(entry => entry.Value.Select(errorCode => new { errorCode, status=entry.Key}))
                                   .ToDictionary(mapping => mapping.errorCode, mapping => mapping.status)
}
保留在最高级别,但是如果打算使用的话,请利用更简洁,更快速的查找和自动检查使用Dictionary<int, List<int>>所获得的重复错误代码。如果仅创建Dictionary的单个实例,则“昂贵”的代码(虽然,虽然不太昂贵,但比哈希查找要多)仅运行一次。    
© www.soinside.com 2019 - 2024. All rights reserved.