Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return Json object on Web API Controller

I used this below code on my asp.net controller to return Json object on my Ajax on javascript

public JsonResult myMethod()
{
    // return a Json Object, you could define a new class
    return Json(new
    {
        Success = true, //error
        Message = "Success" //return exception
    });
}

Jquery-Ajax:

$.ajax({
    type: "POST",
    url: url_ ,
    data: search,
    success: function(data) {   
        //Show Json Properties from Controller ( If Success == false show exception Message from controller )
        if (data.Success)  
        {
            alert(data.Message); //display success 
        }
        else
        {
            alert(data.Message) //display exception
        }
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("error: " + XMLHttpRequest.responseText);
    },
    dataType: 'json'
});

How can this be done on Web Api Controller?

Can you give me some examples or url as reference.

Thanks and Regards

like image 429
BizApps Avatar asked Jan 09 '13 09:01

BizApps


People also ask

How do I return a JSON response?

To return JSON from the server, you must include the JSON data in the body of the HTTP response message and provide a "Content-Type: application/json" response header. The Content-Type response header allows the client to interpret the data in the response body correctly.

How do I return JSON in Web API net core?

To return data in a specific format from a controller that inherits from the Controller base class, use the built-in helper method Json to return JSON and Content for plain text. Your action method should return either the specific result type (for instance, JsonResult ) or IActionResult .


3 Answers

ASP.NET Web API works with a little bit different philosophy. You should return just an entity (or set of entities) and it is up to content negotiation mechanism to return it to the client in the format which he has requested. You can read more about content negotiation here:

  • Everything you want to know about ASP.NET Web API content negotiation

You can of course bypass the content negiotiation by returning a HttpResponseMessage. In this case yo need to serialize the object into JSON yourself (basics of this approach are also described in the article mentioned above).

like image 143
tpeczek Avatar answered Oct 22 '22 20:10

tpeczek


If you create yourself a new HttpContent class for delivering JSON, like...

 public class JsonContent : HttpContent {

    private readonly MemoryStream _Stream = new MemoryStream();
    public JsonContent(object value) {

        Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var jw = new JsonTextWriter( new StreamWriter(_Stream));
        jw.Formatting = Formatting.Indented;
        var serializer = new JsonSerializer();
        serializer.Serialize(jw, value);
        jw.Flush();
        _Stream.Position = 0;

    }
    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) {
        return _Stream.CopyToAsync(stream);
    }

    protected override bool TryComputeLength(out long length) {
        length = _Stream.Length;
        return true;
    }
}

Then you can do,

      public HttpResponseMessage Get() {
            return new HttpResponseMessage() {
                Content = new JsonContent(new
                {
                    Success = true, //error
                    Message = "Success" //return exception
                })
            };
        }

just like you do with JsonResult.

like image 34
Darrel Miller Avatar answered Oct 22 '22 20:10

Darrel Miller


After reading tpeczek's answer, Darrel Miller's answer, and their comment conversation in tpeczek's answer, I wanted get more guidance about when or why I might want to use Web Api and its content negotiation mechanism. tpeczek's link is informative and useful, but I found a couple other write-ups that were more geared at comparing the use of Web Api (and its content negotiation) with, say, plain MVC 4 controller actions that return JsonResult. Here are the ones that I found useful to making such a decision. One of the author concludes that he prefers using plain MVC 4 controllers while the other author prefers using Web Api controllers:

Building a Public HTTP API for Data

I believe there is one correction needed in the above author's post. In there he mentions that,

"...every [Controller] method that begins with 'Get' is automatically associated to the GET verb. Does it sound great? It is, but it also means that you can’t have two methods whose name begin with 'Get' in the same controller class."

According to this answer, you can indeed have multiple 'Get' methods in the same controller if you specify an ActionName attribute. Now here's the second post:

ASP.NET Web API vs. ASP.NET MVC “APIs”

like image 10
Jason Frank Avatar answered Oct 22 '22 21:10

Jason Frank