API 响应 Http 状态代码和自定义错误代码映射
API Response Http Status Code and Custom Error Codes Mapping
如何存储http状态码和错误码的映射。为了给出一个基本概念,我正在处理的状态代码和错误代码类似于 twitter Error codes.
现在的问题是,如果我有一个 http 状态代码的多个错误代码(在 twitter 的情况下
错误代码 3,44,215,323,324,325,407 映射到 http 状态代码 400),如何将这些值存储在我的代码中。我是使用 Dictionary<int, List<int>>
还是有其他方法可以做到这一点?
我将在异常中设置错误代码。异常过滤器将解析错误代码并设置适当的 http 状态代码并发送回 API 响应。
异常Class
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 状态代码是值。但是如果我必须查看特定状态代码的所有错误代码,列表将变得庞大并且可读性将很困难。
坦率地说,用扁平化字典
[...] the list will grow huge and readability will be difficult if I have to see what all error codes we have for a specific status code.
不是使代码过于复杂和性能较低的好借口。虽然 Dictionary<int, List<int>>
的可读性可能会好一点,但代码本身的可读性(应该是重要的代码)会受到影响。恕我直言,这是次优代码结构的症状。
使用平面字典,查找变得像
一样简单
int GetHttpStatus(int errorCode)
{
return errorCodeMappings[errorCode];
}
并且由于一个键不能在字典中存在多次,因此无法将错误代码相加。
(作为一个加号,与使用 Dictionary<int, List<int>>
和反向查找的解决方案相比,这是超快的,因为您可以使用散列。虽然这很可能不是瓶颈,但它是很高兴免费获得。)
如果你把它包装在一些 StatusCodeMapper
class 中,你可以将你的构造函数定义为
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
获得的重复错误代码。如果您只创建 ErrorCodeMapper
的单个实例,"expensive" 代码(好吧,虽然不是太昂贵,但比散列查找多)只会 运行 一次。
如何存储http状态码和错误码的映射。为了给出一个基本概念,我正在处理的状态代码和错误代码类似于 twitter Error codes.
现在的问题是,如果我有一个 http 状态代码的多个错误代码(在 twitter 的情况下
错误代码 3,44,215,323,324,325,407 映射到 http 状态代码 400),如何将这些值存储在我的代码中。我是使用 Dictionary<int, List<int>>
还是有其他方法可以做到这一点?
我将在异常中设置错误代码。异常过滤器将解析错误代码并设置适当的 http 状态代码并发送回 API 响应。
异常Class
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 状态代码是值。但是如果我必须查看特定状态代码的所有错误代码,列表将变得庞大并且可读性将很困难。
坦率地说,用扁平化字典
[...] the list will grow huge and readability will be difficult if I have to see what all error codes we have for a specific status code.
不是使代码过于复杂和性能较低的好借口。虽然 Dictionary<int, List<int>>
的可读性可能会好一点,但代码本身的可读性(应该是重要的代码)会受到影响。恕我直言,这是次优代码结构的症状。
使用平面字典,查找变得像
一样简单int GetHttpStatus(int errorCode)
{
return errorCodeMappings[errorCode];
}
并且由于一个键不能在字典中存在多次,因此无法将错误代码相加。
(作为一个加号,与使用 Dictionary<int, List<int>>
和反向查找的解决方案相比,这是超快的,因为您可以使用散列。虽然这很可能不是瓶颈,但它是很高兴免费获得。)
如果你把它包装在一些 StatusCodeMapper
class 中,你可以将你的构造函数定义为
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
获得的重复错误代码。如果您只创建 ErrorCodeMapper
的单个实例,"expensive" 代码(好吧,虽然不是太昂贵,但比散列查找多)只会 运行 一次。