Skip to main content
 首页 » 编程设计

c#之Web API JSON 响应

2024年05月22日37jackei

我正在为我的客户开发 Web API。他们建议所有响应都应该是通用的 JSON 结构。

{ Data:"", Status:true, Message:"" } 

如果错误意味着

{ Error:"", Status:false, Message:"" } 

创建通用 JSON 结构作为返回值的最佳方法是什么。 现在我创建了一个具有这些属性的类。并从 IHttpActionResult、Error.cs 和 Success.cs 创建了 2 个类,从中创建响应并从 Controller 返回。

东西在我的 Controller 里,

public IHttpActionResult GetNewsAndAnnouncements() 
    { 
        var data = newsAndAnnouncementsDataServices.NewsAndAnnouncements(); 
        if (data != null && data.Count() > 0) 
        { 
            return new Success(Request, "News and Announcements Retrieved Successfully", data); 
        } 
        return new Error(Request, "No News and Announcements Found"); 
    } 

错误.cs

public class Error : IHttpActionResult 
{ 
    private readonly string _message; 
    private readonly HttpRequestMessage _request; 
    private IErrorResponseModel errorResponse; 
 
    public Error(HttpRequestMessage request, string message) 
    { 
        _message = message; 
        _request = request; 
        errorResponse = new ErrorResponseModel(); 
    } 
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
        errorResponse.Message = _message; 
        errorResponse.Status = false; 
        errorResponse.Error = _message; 
        var response = new HttpResponseMessage(HttpStatusCode.BadRequest) 
        { 
            Content = new ObjectContent<object>(errorResponse, new JsonMediaTypeFormatter()), 
            RequestMessage = _request 
        }; 
        return Task.FromResult(response); 
    } 
} 

成功.cs

public class Success : IHttpActionResult 
{ 
    private readonly string _message; 
    private readonly object _data; 
    private readonly HttpRequestMessage _request; 
    private IDataResponseModel dataResponse = new DataResponseModel(); 
    public Success(HttpRequestMessage request, string message, object data) 
    { 
        _message = message; 
        _request = request; 
        _data = data; 
    }  
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
        dataResponse.Message = _message; 
        dataResponse.Status = true; 
        dataResponse.Data = _data; 
        var response = new HttpResponseMessage(HttpStatusCode.OK) 
        { 
            Content = new ObjectContent<object>(dataResponse, new JsonMediaTypeFormatter()), 
            RequestMessage = _request 
        }; 
        return Task.FromResult(response); 
    } 
} 

DataResponseModel.cs

public class DataResponseModel : Mobility.Common.IDataResponseModel  
{ 
    public object Data { get; set; } 
    public string Message { get; set; } 
    public bool Status { get; set; } 
} 

ErrorResponseModel.cs

public class ErrorResponseModel : Mobility.Common.IErrorResponseModel 
{ 
    public object Error { get; set; } 
    public string Message { get; set; } 
    public bool Status { get; set; } 
} 

这是正确的方法吗?我需要建议。有没有其他方法可以实现这一目标。我听说过委派处理程序的事情。但是我对这些没有太多的想法。 请帮助我。

请您参考如下方法:

此问题的另一个解决方案是使用自定义处理程序连接到 ASP.NET 管道以构建通用响应对象。 例如:

[DataContract] 
public class ApiResponse 
{ 
  [DataMember] 
  public string Version { get { return "1.2.3"; } } 
 
  [DataMember] 
  public int StatusCode { get; set; } 
 
  [DataMember(EmitDefaultValue = false)] 
  public string ErrorMessage { get; set; } 
 
  [DataMember(EmitDefaultValue = false)] 
  public object Result { get; set; } 
 
  public ApiResponse(HttpStatusCode statusCode, object result = null, string   errorMessage = null) 
  { 
      StatusCode = (int)statusCode; 
      Result = result; 
      ErrorMessage = errorMessage; 
  } 
} 

查看此帖子以获取引用实现 http://www.devtrends.co.uk/blog/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information