Web Api: recommended way to return json string

I have several services that already receive a json string (and not an object) that should be returned to the client. I am currently creating an HttpResponseMessage explicitly and setting its Content property to the json string that the service receives:

 var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(jsonUtilizadores, Encoding.UTF8, "application/json"); return response; 

Now, the best way to do this with the new IHttpActionResult ? Using the Content or Ok method completes wrapping the json string with quotation marks, which I don't want.

Any feedback?

+6
source share
3 answers

Create your own implementation. The frame is extensible through IHttpActionResult .

Next, a custom result and extension method is created ...

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

... which can then be applied to ApiController derived classes. Significant simplification of previous calls

 return this.JsonString(jsonUtilizadores); //defaults to 200 OK 

or with the desired HTTP status code

 return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest); 
+8
source

Set your web api to return the 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 answer 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 the following class:

  public class ResponseStatus { public string Status { get; set; } public string Message { get; set; } } 
+4
source

Leave a response format for content negotiation, to be REST compatible, the client must decide which format it wants.

In the action of your web API, you should simply return Ok(your object) and the web API will see what is the best format for returning it.

If you need to omit other formatting elements, simply delete the other MediaTypeFormatter objects in the same way as Nkosi advises.

+2
source

Source: https://habr.com/ru/post/1012690/


All Articles