web-dev-qa-db-fra.com

Comment renvoyer un objet Json sur Web API Controller

J'ai utilisé ce code ci-dessous sur mon contrôleur asp.net pour renvoyer l'objet Json sur mon Ajax sur 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'
});

Comment cela peut-il être fait sur Web Api Controller?

Pouvez-vous me donner quelques exemples ou URL comme référence.

Merci et salutations

23
BizApps

Si vous créez vous-même une nouvelle classe HttpContent pour fournir JSON, comme ...

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

Ensuite, vous pouvez le faire,

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

tout comme vous le faites avec JsonResult.

25
Darrel Miller

L'API Web ASP.NET fonctionne avec une philosophie légèrement différente. Vous devez renvoyer uniquement une entité (ou un ensemble d'entités) et il appartient au mécanisme de négociation de contenu de le renvoyer au client dans le format qu'il a demandé. Vous pouvez en savoir plus sur la négociation de contenu ici:

Vous pouvez bien sûr contourner la négociation du contenu en renvoyant un HttpResponseMessage. Dans ce cas, vous devez sérialiser vous-même l'objet en JSON (les bases de cette approche sont également décrites dans l'article mentionné ci-dessus).

30
tpeczek

Après avoir lu la réponse de tpeczek, la réponse de Darrel Miller et leur conversation de commentaires dans la réponse de tpeczek, je voulais obtenir plus de conseils sur quand ou pourquoi je pourrais utiliser Web Api et son mécanisme de négociation de contenu. Le lien de tpeczek est informatif et utile, mais j'ai trouvé quelques autres articles plus adaptés à la comparaison de l'utilisation de Web Api (et de sa négociation de contenu) avec, par exemple, des actions de contrôleur MVC 4 simples qui retournent JsonResult . Voici celles que j'ai trouvées utiles pour prendre une telle décision. L'un des auteurs conclut qu'il préfère utiliser des contrôleurs simples MVC 4 tandis que l'autre auteur préfère utiliser des contrôleurs Web Api:

Création d'une API HTTP publique pour les données

Je crois qu'il y a une correction nécessaire dans le post de l'auteur ci-dessus. Là, il mentionne que,

"... chaque méthode [Controller] qui commence par 'Get' est automatiquement associée au verbe GET. Est-ce que ça sonne bien? C'est le cas, mais cela signifie aussi que vous ne pouvez pas avoir deux méthodes dont le nom commence par 'Get' dans la même classe de contrôleur. "

Selon cette réponse, vous pouvez en effet avoir plusieurs méthodes 'Get' dans le même contrôleur si vous spécifiez un ActionName attribut. Voici maintenant le deuxième article:

API Web ASP.NET par rapport aux "API" ASP.NET MVC

10
Jason Frank