0

J'ai créé un web-API de produits suivant 1 et 2 tutoriel. Le 2ème tutoriel est l'application console dans laquelle le web-api est appelé. Maintenant, quand je crée un seul produit, il est capable de voir. Mais quand je crée plus d'un produit, seule la dernière entrée est visible. Pour une meilleure compréhension, voir le code ci-dessous.GET toutes les données de l'API WEB à l'aide de l'application console

static HttpClient client = new HttpClient(); 

    static void ShowProduct(Product product) 
    { 

     Console.WriteLine($"Name: {product.Name}\tPrice: {product.Price}\tCategory: {product.Category}"); 
    } 

    static async Task<Uri> CreateProductAsync(Product product) 
    { 
     HttpResponseMessage response = await client.PostAsJsonAsync("api/product/", product); 
     response.EnsureSuccessStatusCode(); 

     // return URI of the created resource. 
     return response.Headers.Location; 
    } 

    static async Task<Product> GetProductAsync(string path) 
    { 
     Product product = null; 
     HttpResponseMessage response = await client.GetAsync(path); 
     if (response.IsSuccessStatusCode) 
     { 
      product = await response.Content.ReadAsAsync<Product>(); 
     } 
     return product; 
    } 
static async Task RunAsync() 
    { 
     int a; 
     decimal price = 0; 
     string name = null, category = null; 
     char option; 
     //string url; 
     client.BaseAddress = new Uri("http://localhost:7361/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     Uri url = null; 

     try 
     { 
      label: 
      Console.Write("1. Create a product\n"); 
      Console.Write("2. View products\n"); 
      Console.Write("3. Update a product\n"); 
      Console.Write("4. Delete a product\n"); 
      Console.Write("5. Exit\n"); 

      Console.WriteLine("\nEnter your choice: "); 
      a = Convert.ToInt32(Console.ReadLine()); 


      switch(a) 
      { 
       case 1: 

        Console.WriteLine("Enter name of the product: "); 
        name = Convert.ToString(Console.ReadLine()); 

        Console.WriteLine("\nEnter price of the product: "); 
        price = Convert.ToDecimal(Console.ReadLine()); 
        Console.WriteLine("\nEnter category of the product: "); 
        category = Convert.ToString(Console.ReadLine()); 

        // Create a new product 
        Product product = new Product { Name = name, Price = price, Category = category }; 

        url = await CreateProductAsync(product); 
        Console.WriteLine($"Created at {url}"); 

        Console.WriteLine("Want to create more product(s)? (y/n): "); 
        option = Convert.ToChar(Console.ReadLine()); 

        if(option == 'y' || option == 'Y') 
        { 
         Console.Clear(); 
         goto case 1; 
        } 
        else if(option == 'n' || option == 'N') 
        { 
         Console.Clear(); 
         goto label; 
        } 

        break; 

       case 2: 

        // Get the product 
        product = await GetProductAsync(url.PathAndQuery); 

        ShowProduct(product); 

        break; 
        //case 3:... 
        //case 4:... 
        //case 5:... 
     } 

Je veux afficher tous les produits créés. Pour cela je dois créer une liste de produits en les créant. Mais le problème est que je ne sais pas où le faire?

Update 1

Le débogage du code du static async Task<Product> GetProductAsync(string path) le path obtient le dernier ID de produit comme 'api/produit/2', mais je veux être comme ça api/produit/'. Le chemin inclut le dernier entré id.

Mise à jour 2

Pour obtenir tous les produits que je sont entrés dans le url dans product = await GetProductAsync("http://localhost:7361/api/product");

Mais maintenant, après l'exécution de l'application que je reçois l'erreur ci-dessous.

Cannot deserialize the current JSON object (e.g. {“name”:“value”}) 

Mise à jour 3

En cochant la réponse de l'API dans Postman ci-après les données que je suis

[ 
{ 
    "Id": 1, 
    "Name": "yo-yo", 
    "Category": "toys", 
    "Price": 45 
}, 
{ 
    "Id": 2, 
    "Name": "mobile", 
    "Category": "electronics", 
    "Price": 45000 
}] 

Toute aide serait très appréciée

+0

Quelle réponse JSON obtenez-vous de l'API? 'GetProductAsync' renvoie un seul produit. La méthode 'ShowProduct' n'a qu'une seule instance de Product comme argument et vous ne passez qu'un seul produit à l'argument' ShowProduct'. Donc, il va sûrement afficher un seul produit. Vous devez vérifier ce qui est renvoyé par l'API lorsque vous demandez tous les produits. –

+0

@ChetanRanpariya Je l'ai fait dans 'Update 2'. – faisal1208

+0

Vous devez savoir quel JSON vous obtenez de l'API pour comprendre pourquoi vous obtenez l'erreur 'Impossible de désérialiser l'objet JSON en cours'.On dirait que l'API vous renvoie la collection de produits et que vous essayez de la désérialiser en un seul produit. Si vous partagez la réponse JSON de l'API, je peux fournir une solution concrète. –

Répondre

1

Le JSON est revenu de l'API (qui retourne tous les produits) représente la collection d'objets mais dans votre code vous êtes tryi ng pour le désérialiser en objet produit unique.

product = await response.Content.ReadAsAsync<Product>(); 

Vous trouverez ci-dessous les modifications à apporter pour que votre code fonctionne. Créez une nouvelle méthode qui appellera l'API GetAllProducts et retournera la collection de produits comme suit.

static async Task<List<Product>> GetAllProductsAsync(string path) 
{ 
    List<Product> products = null; 
    HttpResponseMessage response = await client.GetAsync(path); 
    if (response.IsSuccessStatusCode) 
    { 
     products = await response.Content.ReadAsAsync<List<Product>>(); 
    } 
    return products; 
} 

Je suggère de créer une nouvelle méthode, car vous pourriez utiliser l'ancienne méthode ailleurs. Maintenant, utilisez la nouvelle méthode comme suit dans le commutateur 2 cas:

case 2: 
    // Get all the products 
    var products = await GetAllProductsAsync(url.PathAndQuery); 

    // Loop thru the products and call ShowProduct method for each product in the list. 
    foreach(var product in products) 
    { 
     ShowProduct(product); 
    } 

Cela devrait vous aider à résoudre votre problème.

+0

J'ai ajouté le code que vous avez fournir, mais encore il me donne la même erreur Can not désérialiser l'objet JSON en cours (par exemple { « name »: « valeur »}) dans le type « du système. Collections.Generic.List'1 [ClientSample.Product] 'car le type requiert un tableau JSON (par exemple [1,2,3]) pour désérialiser correctement. Pour corriger cette erreur, soit modifier le JSON à un tableau JSON (par exemple, [1,2,3]) ou modifier le type désérialisé afin qu'il soit un type .NET normal (par exemple, pas un type primitif comme nombre entier, et non pas un type de collection comme un tableau ou liste ) qui peuvent être désérialisée d'un JSON object.' – faisal1208

+0

vous appelez la méthode 'GetAllProductsAsync' dans le cas 2: –

+0

Lors du débogage du code, le chemin est à nouveau 'api/product/2'. Et oui, je fais appel 'GetALLProductAsync' en cas 2. Aussi les' Liste produits = nouvelle liste (); 'le nombre est égal à zéro – faisal1208