【问题标题】:Web API Json ResponseWeb API Json 响应
【发布时间】:2015-11-22 05:15:27
【问题描述】:

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

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

如果错误意味着

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

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

东西在我的控制器里,

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; }
}

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

【问题讨论】:

  • 对我来说这似乎是一个合理的实现。
  • 为什么不返回Ok(dataResponse)BadRequest(errorResponse)
  • @Dennis。从哪里?来自 Controller 或 Success.cs。在 BadRequest() 中,我们只能返回一个字符串或 Modelstatedictionry。我想退货。

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


【解决方案1】:

此问题的另一个解决方案是使用自定义处理程序挂钩到 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

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 2020-05-03
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多