当前位置:   article > 正文

.Net Core webapi RestFul 统一接口数据返回格式_net core 统一api返回格式

net core 统一api返回格式

RestFul风格盛行的年代,大部分接口都需要一套统一的数据返回格式,那么我们怎么才能保证使用统一的json数据格式返回呢,下面给大家简单介绍一下:

假如我们需要接口统一返回一下数据格式

  1. {
  2. "statusCode": 200,
  3. "successful": true,
  4. "message": null,
  5. "data": object
  6. }

json对象中data是返回的实际结果对象,可以是一个对象、一个list、一个字符串、一个数字......

但是整体的json格式要以上面的为准

一般这种情况我们有两种实现方式:

1、自定义一个统一返回类

2、使用过滤器(Filter)实现

下面先介绍第一种,自定义一个接口返回类:

创建对应的接口类和实现类

  • ApiResponse.cs//实现类
  • IApiResponse.cs://几个相关的接口

IApiResponse.cs

  1. public interface IApiResponse
  2. {
  3. public int StatusCode { get; set; }
  4. public bool Successful { get; set; }
  5. public string? Message { get; set; }
  6. }
  7. public interface IApiResponse<T> : IApiResponse
  8. {
  9. public T? Data { get; set; }
  10. }
  11. public interface IApiErrorResponse
  12. {
  13. public Dictionary<string, object> ErrorData { get; set; }
  14. }

保证了所有相关对象都来自 IApiResponse 接口

ApiResponse.cs

  1. public class ApiResponse<T> : IApiResponse<T>
  2. {
  3. public ApiResponse()
  4. {
  5. }
  6. public ApiResponse(T? data)
  7. {
  8. Data = data;
  9. }
  10. public int StatusCode { get; set; } = 200;
  11. public bool Successful { get; set; } = true;
  12. public string? Message { get; set; }
  13. public T? Data { get; set; }
  14. /// <summary>
  15. /// 实现将 <see cref="ApiResponse"/> 隐式转换为 <see cref="ApiResponse{T}"/>
  16. /// </summary>
  17. /// <param name="apiResponse"><see cref="ApiResponse"/></param>
  18. public static implicit operator ApiResponse<T>(ApiResponse apiResponse)
  19. {
  20. return new ApiResponse<T>
  21. {
  22. StatusCode = apiResponse.StatusCode,
  23. Successful = apiResponse.Successful,
  24. Message = apiResponse.Message
  25. };
  26. }
  27. }
  28. public class ApiResponse : IApiResponse, IApiErrorResponse
  29. {
  30. public int StatusCode { get; set; } = 200;
  31. public bool Successful { get; set; } = true;
  32. public string? Message { get; set; }
  33. public object? Data { get; set; }
  34. /// <summary>
  35. /// 可序列化的错误
  36. /// <para>用于保存模型验证失败的错误信息</para>
  37. /// </summary>
  38. public Dictionary<string, object>? ErrorData { get; set; }
  39. public ApiResponse()
  40. {
  41. }
  42. public ApiResponse(object data)
  43. {
  44. Data = data;
  45. }
  46. public static ApiResponse NoContent(string message = "NoContent")
  47. {
  48. return new ApiResponse
  49. {
  50. StatusCode = StatusCodes.Status204NoContent,
  51. Successful = true,
  52. Message = message
  53. };
  54. }
  55. public static ApiResponse Ok(string message = "Ok")
  56. {
  57. return new ApiResponse
  58. {
  59. StatusCode = StatusCodes.Status200OK,
  60. Successful = true,
  61. Message = message
  62. };
  63. }
  64. public static ApiResponse Ok(object data, string message = "Ok")
  65. {
  66. return new ApiResponse
  67. {
  68. StatusCode = StatusCodes.Status200OK,
  69. Successful = true,
  70. Message = message,
  71. Data = data
  72. };
  73. }
  74. public static ApiResponse Unauthorized(string message = "Unauthorized")
  75. {
  76. return new ApiResponse
  77. {
  78. StatusCode = StatusCodes.Status401Unauthorized,
  79. Successful = false,
  80. Message = message
  81. };
  82. }
  83. public static ApiResponse NotFound(string message = "NotFound")
  84. {
  85. return new ApiResponse
  86. {
  87. StatusCode = StatusCodes.Status404NotFound,
  88. Successful = false,
  89. Message = message
  90. };
  91. }
  92. public static ApiResponse BadRequest(string message = "BadRequest")
  93. {
  94. return new ApiResponse
  95. {
  96. StatusCode = StatusCodes.Status400BadRequest,
  97. Successful = false,
  98. Message = message
  99. };
  100. }
  101. public static ApiResponse BadRequest(ModelStateDictionary modelState, string message = "ModelState is not valid.")
  102. {
  103. return new ApiResponse
  104. {
  105. StatusCode = StatusCodes.Status400BadRequest,
  106. Successful = false,
  107. Message = message,
  108. ErrorData = new SerializableError(modelState)
  109. };
  110. }
  111. public static ApiResponse Error(string message = "Error", Exception? exception = null)
  112. {
  113. object? data = null;
  114. if (exception != null)
  115. {
  116. data = new
  117. {
  118. exception.Message,
  119. exception.Data
  120. };
  121. }
  122. return new ApiResponse
  123. {
  124. StatusCode = StatusCodes.Status500InternalServerError,
  125. Successful = false,
  126. Message = message,
  127. Data = data
  128. };
  129. }
  130. }

分别实现类带有泛型的 ApiResponse<T> 类和 ApiResponse 类 

注意在泛型类中,使用运算符重载,实现了 ApiResponse 到 ApiResponse<T> 的隐式转换。

在接口实现处返回一个 ApiResponse<T> 对象:

  1. [HttpGet]
  2. public ApiResponse<UserEntity> Get(string name)
  3. {
  4. var list = new List<UserEntity>()
  5. {
  6. new UserEntity() { Name = "张三" },
  7. new UserEntity(){Name = "李四"}
  8. };
  9. var user = list.Find(p => p.Name == name);
  10. return user == null ? ApiResponse.NotFound() : new ApiResponse<UserEntity>(user);
  11. }

注意看最后一句 

return user == null ? ApiResponse.NotFound() : new ApiResponse<UserEntity>(user);

ApiResponse.NotFound() 返回的是一个 ApiResponse 对象

但这接口的返回值明明是 ApiResponse<UserEntity> 类型呀,这不是类型不一致吗?

不过在 ApiResponse<T> 中,我们定义了一个运算符重载,实现了 ApiResponse 类型到 ApiResponse<T> 的隐式转换,所以就完美解决这个问题,大大减少了代码量。

来看一下最后运行效果:

下一章介绍一下如何通过自定义过滤器的方式实现统一接口返回数据格式:

.NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/550388
推荐阅读
相关标签
  

闽ICP备14008679号