web-dev-qa-db-fra.com

Construire une réponse JSON dans le contrôleur API Web

Dans un projet WebAPI, j'ai un contrôleur qui vérifie le statut d'un produit en fonction d'une valeur saisie par l'utilisateur.

Disons qu'ils entrent "123" et que la réponse devrait être "status": 1, ET une liste de produits. S'ils entrent "321", le "statut" est 0, ET une liste de produits.

Ma question est, comment puis-je construire une telle chaîne correcte dans un contrôleur WebAPI.

[Route("{value:int}")]
public string GetProducts(int value)
{
    var json = "";
    var products = db.Products;
    if (products.Any())
    {
        foreach (var s in products)
        {
            ProductApi product = new ProductApi();
            product.Name = s.Name;
            json += JsonConvert.SerializeObject(supplier);
        }
    }

    var status = db.Status;
    if (status.Any())
    {
        json += "{status:1}";
    }
    else
    {
        json += "{status:0}";
    }

    return json;
}

public class ProductApi
{
    public string Name { get; set; }
}

De plus, cette sortie/réponse est-elle considérée comme valide?

[
    {
        "id":1,
        "name":"product name"
    },
    {
        "id":2,
        "name":"product name 2"
    },
    {
        "id":3,
        "name":"product name 3"
    }
]

{
    "status": 0
}
17
brother

Alors voici les changements pour votre post:

Tout d’abord, vous devriez obliger votre api à retourner Json par défaut lorsque vous passez un text/html demande (est-ce que vous cherchez?), en ajoutant cette ligne à votre classe WebApiConfig:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

Deuxièmement, j'ai changé le code pour retourner un objet réel, personnifiant votre réponse:

public class ProductApiCollection
{   
    public ProductApi[] Products { get; set; }      
    public byte Status { get; set; }
}

public class ProductApi
{
    public string Name { get; set; }
}

Corps de la méthode:

public ProductApiCollection Get()
{
    var result = new ProductApiCollection();
    var dbProducts = db.Products;
    var apiModels = dbProducts.Select(x => new ProductApi { Name = x.Name } ).ToArray();
    result.Products = apiModels;

    var status = db.Status.Any() ? 1 : 0;
    result.Status = status;

    return result;
}

Cela donnera l'exemple suivant json:

{
  "Products": [
    {
      "Name": "Pork"
    },
    {
      "Name": "Beef"
    },
    {
      "Name": "Chicken"
    },
    {
      "Name": "Salad"
    }
  ],
  "Status": 1
}

Je vous conseille vivement de ne pas effectuer de formatage manuel pour de telles choses et de vous fier aux bibliothèques intégrées et tierces. Sinon, vous réinventerez les éléments déjà disponibles, testés et prêts à fonctionner.

35
Red

Tout comme raderick mentionné, vous n'avez pas besoin de créer votre propre infrastructure JSON personnalisée.

public class ProductApi
{
    public int Id {get;set;}
    public string Name { get; set; }
}

public class ResponseDTO
{
    public int Status {get;set;}
    public List<ProductApi> { get; set; }
}

Et dans votre action API, retournez comme ceci:

[Route("{value:int}")]
public ResponseDTO GetProducts(int value)
{
    ResponseDTO result = ...// construct response here 

    return result;
}
4
Tamas Ionut