c# - Web API JSON 响应

标签 c# json rest json.net asp.net-web-api2

我正在为我的客户开发 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

关于c# - Web API JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33851860/

相关文章:

c# - 一个单元测试如何修改 XML 文档?

javascript - 如何从 JSON 对象中检索带有坐标的变量

javascript - 使用 (data.next) vanilla JS 进行 Swapi API 分页

c# - HttpWebRequest 中的 SSL 重新协商 (SEC_I_RENEGOTIATE) 问题并且没有保持事件状态

c# - 模块窗口中缺少项目 dll

c# - 如何 : Prevent Timeout When Inspecting Unavailable Network Share - C#

java - Json比较异常: Can't access getJSONArray in java

javascript - 新行在客户端和服务器端如何字符串化?

rest - 当域规则无效时,put 方法上休息服务的 http 响应代码是什么

json - ConnectWise API 获取无效 token 响应