web-dev-qa-db-fra.com

Comment renvoyer JSON à partir d'une fonction Azure

Je joue avec Azure Functions . Cependant, j'ai l'impression d'être perplexe sur quelque chose d'assez simple. J'essaie de comprendre comment retourner un JSON de base. Je ne sais pas comment créer un fichier JSON et le renvoyer à ma demande. 

Il était une fois, je créais un objet, peuplais ses propriétés et le sérialisais. Alors j'ai commencé dans cette voie:

#r "Newtonsoft.Json"

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info($"Running Function");    
    try {      
      log.Info($"Function ran");

      var myJSON = GetJson();

      // I want myJSON to look like:
      // {
      //   firstName:'John',
      //   lastName: 'Doe',
      //   orders: [
      //     { id:1, description:'...' },
      //     ...
      //   ]
      // }
      return ?;
    } catch (Exception ex) {
        // TODO: Return/log exception
        return null;
    }
}

public static ? GetJson() 
{
  var person = new Person();
  person.FirstName = "John";
  person.LastName = "Doe";

  person.Orders = new List<Order>();
  person.Orders.Add(new Order() { Id=1, Description="..." });

  ?
}

public class Person 
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public List<Order> Orders { get; set; }
}

public class Order
{
  public int Id { get; set; }
  public string Description { get; set; }
}

Cependant, je suis totalement bloqué sur le processus de sérialisation et de renvoi. Je suppose que je suis habitué à renvoyer JSON dans ASP.NET MVC où tout est une action.

19
xam developer

Voici un exemple complet d'une fonction Azure renvoyant un objet JSON correctement formaté au lieu de XML:

#r "Newtonsoft.Json"
using System.Net;
using Newtonsoft.Json;
using System.Text;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    var myObj = new {name = "thomas", location = "Denver"};
    var jsonToReturn = JsonConvert.SerializeObject(myObj);

    return new HttpResponseMessage(HttpStatusCode.OK) {
        Content = new StringContent(jsonToReturn, Encoding.UTF8, "application/json")
    };
}

Accédez au noeud final dans un navigateur et vous verrez:

{
  "name": "thomas",
  "location": "Denver"
}
24
Levi Fuller

Vous pouvez prendre req à partir de

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)

et créer la réponse en utilisant

return req.CreateResponse(HttpStatusCode.OK, json, "application/json");

ou l'une des autres surcharges dans Assembly System.Web.Http.

Plus d'infos sur docs.Microsoft.com

11
hansmbakker

JSON est assez facile, la bibliothèque Newtonsoft.Json est un cas particulier . Vous pouvez l'inclure en l'ajoutant en haut du fichier de script:

#r "Newtonsoft.Json"

using Newtonsoft.Json;

Alors votre fonction devient:

public static string GetJson() 
{
  var person = new Person();
  person.FirstName = "John";
  person.LastName = "Doe";

  person.Orders = new List<Order>();
  person.Orders.Add(new Order() { Id=1, Description="..." });

  return JsonConvert.SerializeObject(person);
}
5
juunas

Il semble que cela puisse être réalisé simplement en utilisant le type de média "application/json", sans qu'il soit nécessaire de sérialiser explicitement Person avec Newtonsoft.Json.

Voici l'exemple de travail complet donnant le résultat suivant:

{"FirstName":"John","LastName":"Doe","Orders":[{"Id":1,"Description":"..."}]}

Le code est donné comme ci-dessous:

[FunctionName("StackOverflowReturnJson")]
    public static HttpResponseMessage Run([HttpTrigger("get", "post", Route = "StackOverflowReturnJson")]HttpRequestMessage req, TraceWriter log)
    {
        log.Info($"Running Function");
        try
        {
            log.Info($"Function ran");

            var myJSON = GetJson();  // Note: this actually returns an instance of 'Person' 

            // I want myJSON to look like:
            // {
            //   firstName:'John',
            //   lastName: 'Doe',
            //   orders: [
            //     { id:1, description:'...' },
            //     ...
            //   ]
            // }
            var response = req.CreateResponse(HttpStatusCode.OK, myJSON, JsonMediaTypeFormatter.DefaultMediaType); // DefaultMediaType = "application/json" does the 'trick'
            return response;
        }
        catch (Exception ex)
        {
            // TODO: Return/log exception
            return null;
        }
    }

    public static Person GetJson()
    {
        var person = new Person();
        person.FirstName = "John";
        person.LastName = "Doe";

        person.Orders = new List<Order>();
        person.Orders.Add(new Order() { Id = 1, Description = "..." });

        return person;
    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<Order> Orders { get; set; }
    }

    public class Order
    {
        public int Id { get; set; }
        public string Description { get; set; }
    }
5
Dima Gershman

Vous pouvez modifier la signature de la méthode en:

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)

et cela permettra aux données JSON d'être renvoyées.

2
Burak Tasci

J'ai eu un problème similaire et cela semblait être le post le plus populaire sans réponse. Après avoir déterminé quel nœud le nœud ci-dessous devrait fonctionner, il devrait vous donner exactement ce que vous recherchez. Les autres exemples renvoient toujours une représentation sous forme de chaîne, ce qui renverra JSON. 

N'oubliez pas de déclarer en utilisant System.Text; et aussi ajouter:

return JsonConvert.SerializeObject(person);

à la fonction GetJson selon la réponse de Juunas.

    return new HttpResponseMessage(HttpStatusCode.OK)
       {
           Content = new StringContent(GetJson(), Encoding.UTF8, "application/json")
       };

0
Matt