1

I am developing Web API for my client. They have suggestion that all response should be a common JSON structure.

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

If error means

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

Which is the best method to create a common JSON structure as returns. Now I created a class having these properties. And created 2 classes from IHttpActionResult,Error.cs and Success.cs, From that the response is created and returned from the controller.

The thing is in my 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");
    }

Error.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);
    }
}

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

Is this a right method. I need suggestion. Is there any other way to achieve this. I heard about delegating handler something. But I don't have much idea on these. Please help me.

3
  • It seems like a reasonable implementation to me. Commented Nov 22, 2015 at 5:23
  • Why don't return Ok(dataResponse) or BadRequest(errorResponse)? Commented Nov 22, 2015 at 5:44
  • @Dennis. From where? From Controller or Success.cs. In BadRequest() we can return only a string or Modelstatedictionry. I want to return a model. Commented Nov 22, 2015 at 5:47

1 Answer 1

2

Another solution to this problem is to hook into the ASP.NET pipeline using custom handlers to build a common response object. For instance:

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

Have a look at this post for a reference implementation http://www.devtrends.co.uk/blog/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.