0

Ich habe eine web-API von Produkten folgenden 1 und 2 Tutorial erstellt. Das 2. Tutorial ist die Konsolenanwendung, in der der web-api aufgerufen wird. Wenn ich nun ein einzelnes Produkt erstelle, kann es angezeigt werden. Aber wenn ich mehr als ein Produkt erstelle, ist nur der letzte Eintrag sichtbar. Zum besseren Verständnis siehe den folgenden Code.GET alle Daten von WEB-API mit Konsole-Anwendung

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:... 
     } 

Ich möchte alle erstellten Produkte anzeigen. Dazu muss ich beim Erstellen eine Produktliste erstellen. Aber das Problem ist, dass ich nicht weiß, wo ich es machen soll?

Update 1

Auf Debuggen den Code die static async Task<Product> GetProductAsync(string path) die path die letzte Produkt-ID als 'api/product/2', aber ich will sein wie das 'api/Produkt /' bekommt. Der Pfad enthält die zuletzt eingegebene id.

Update 2

Für alle Produkte bekommen die url in Ich habe product = await GetProductAsync("http://localhost:7361/api/product");

eingegeben Aber jetzt nach der Ausführung der Anwendung ich die unten Störung erhalte.

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

aktualisieren 3

Durch die API-Antwort in Postman Überprüfung finden Sie die Daten, die i

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

bekam Jede Hilfe wäre sehr

+0

Welche JSON-Antwort erhalten Sie von der API? 'GetProductAsync' gibt nur ein Produkt zurück. Die 'ShowProduct'-Methode hat nur eine Instanz von Product als Argument und Sie übergeben nur ein Produkt an das' ShowProduct'-Argument. So wird es sicher nur ein Produkt anzeigen. Sie müssen überprüfen, was von der API zurückgegeben wird, wenn Sie alle Produkte von dieser API anfordern. –

+0

@ChetanRanpariya Ich habe es in 'Update 2' getan. – faisal1208

+0

Sie müssen wissen, welche JSON Sie von der API erhalten, um zu verstehen, warum Sie den Fehler 'Das aktuelle JSON-Objekt nicht deserialisieren' erhalten können.Es sieht so aus, als ob die API Ihnen die Sammlung von Produkten zurückgibt und Sie versuchen, sie zu einem einzigen Produkt zu deserialisieren. Wenn Sie die JSON-Antwort der API teilen, kann ich eine konkrete Lösung anbieten. –

Antwort

1

Die JSON von zurück geschätzt werden Die API (die alle Produkte zurückgibt) stellt die Sammlung von Objekten dar, aber in Ihrem Code sind Sie tryi ng, um es zu einem einzelnen Produktobjekt zu deserialisieren.

Folgendes ist die Änderung, die Sie tun müssen, damit Ihr Code funktioniert. Erstellen Sie eine neue Methode, die die GetAllProducts-API aufruft und die Sammlung von Produkten wie folgt zurückgibt.

Ich schlage vor, neue Methode zu erstellen, weil Sie die alte Methode woanders verwenden können. Verwenden Sie nun die neue Methode wie im Schaltergehäuse folgenden 2:

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

Dies sollten Sie Ihr Problem beheben helfen.

+0

Ich habe den Code hinzugefügt, den Sie haben, aber immer noch gibt es mir den gleichen Fehler 'Kann das aktuelle JSON-Objekt (zB {" name ":" value "}) nicht in Typ 'System deserialisieren. Collections.Generic.List'1 [ClientSample.Product] ', da der Typ ein JSON-Array (z. B. [1,2,3]) benötigt, um korrekt zu deserialisieren. Um diesen Fehler zu beheben, ändern Sie den JSON entweder in ein JSON-Array (zB [1,2,3]) oder ändern Sie den deserialisierten Typ so, dass es ein normaler .NET-Typ ist (zB kein primitiver Typ wie Integer, kein Collection-Typ) wie ein Array oder eine Liste ), die aus einem JSON-Objekt deserialisiert werden kann. – faisal1208

+0

Rufen Sie in Fall 2 die Methode 'GetAllProductsAsync' auf? –

+0

Beim Debuggen des Codes ist der Pfad wieder 'api/product/2'. Und ja, ich rufe 'GetALLProductAsync' in Fall 2 an. Auch die 'Liste products = new Liste (); 'Die Anzahl ist Null – faisal1208