Web Api: recommended way to return json string
Create custom implementation. The framework is extensible via the IHttpActionResult
.
The following creates a custom result and extension method...
public static class JsonStringResultExtension {
public static CustomJsonStringResult JsonString(this ApiController controller, string jsonContent, HttpStatusCode statusCode = HttpStatusCode.OK) {
var result = new CustomJsonStringResult(controller.Request, statusCode, jsonContent);
return result;
}
public class CustomJsonStringResult : IHttpActionResult {
private string json;
private HttpStatusCode statusCode;
private HttpRequestMessage request;
public CustomJsonStringResult(HttpRequestMessage httpRequestMessage, HttpStatusCode statusCode = HttpStatusCode.OK, string json = "") {
this.request = httpRequestMessage;
this.json = json;
this.statusCode = statusCode;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {
return Task.FromResult(Execute());
}
private HttpResponseMessage Execute() {
var response = request.CreateResponse(statusCode);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return response;
}
}
}
...that can then be applied to ApiController
derived classes. Greatly simplifying previous calls to
return this.JsonString(jsonUtilizadores); //defaults to 200 OK
or with desired HTTP status code
return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest);
Set your Web Api to return JSON Format:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
// Force to ignore Request Content Type Header and reply only JSON
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
var corsAttr = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(corsAttr);
}
and then return response like this:
[HttpGet]
[Route("{taskId}/list")]
public IHttpActionResult GetTaskDocuments(string taskId)
{
var docs = repository.getTaskDocuments(taskId);
if (docs != null)
{
return Ok(docs);
}
else
{
return Ok(new ResponseStatus() { Status = Constants.RESPONSE_FAIL, Message = repository.LastErrorMsg });
}
}
Where ResponseStatus is next class:
public class ResponseStatus
{
public string Status { get; set; }
public string Message { get; set; }
}
Leave the response format to the content negotiation in order to be REST compliant, the client should decide what format it wants.
In your web API action, you should just return Ok(your object)
and web API will see what is the best format to return it.
If you need to omit other formatters, then just remove the other MediaTypeFormatter
objects just as Nkosi advised.