0

我已經在12教程中創建了產品web-API。第二個教程是調用web-api的控制檯應用程序。現在,當我創建一個單一的產品,然後它是查看能力。但是,當我創建不止一種產品時,只有最後一個條目才能被查看。爲了更好的理解,請看下面的代碼。使用控制檯應用程序從WEB API獲取所有數據

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

我想查看所有創建的產品。爲此,我必須在創建產品時創建產品列表。但問題是我不知道該在哪裏做?

更新1

在調試代碼的static async Task<Product> GetProductAsync(string path)path得到最後一個產品ID爲 'API /產品/ 2',但我想是這樣的 'API /產品/'。路徑包括最後輸入的id

更新2

爲了讓所有的產品我在product = await GetProductAsync("http://localhost:7361/api/product");

進入url但現在運行的應用程序後,我得到下面的錯誤。

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

更新3

通過檢查Postman以下API響應是我得到

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

任何幫助將高度讚賞

+0

你從API獲得的JSON響應是什麼? 'GetProductAsync'只返回一個Product。 'ShowProduct'方法只有一個Product實例作爲參數,並且您只將一個產品傳遞給'ShowProduct'參數。所以肯定它只會顯示一個產品。您需要檢查當您向其請求所有產品時API返回的內容。 –

+0

@ChetanRanpariya我在'Update 2'中完成了它。 – faisal1208

+0

您需要知道您從API獲取的JSON,以瞭解您爲什麼獲得'無法反序列化當前的JSON對象錯誤。看起來API會向您返回產品集合,並且您試圖將其反序列化爲單個產品。如果你分享API的JSON響應,我可以提供一些具體的解決方案。 –

回答

1

的JSON從返回的數據API(返回所有產品)表示對象的集合,但在代碼中您是tryi將其反序列化爲單個產品對象。

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

以下是爲使代碼正常工作而需要做的更改。 創建一個將調用GetAllProducts API並返回產品集合的新方法,如下所示。

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

我建議創建新方法,因爲您可能在其他地方使用舊的方法。 現在,使用新的方法,在開關的情況下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); 
    } 

這應該可以幫助您解決問題。

+0

我已經添加了你已經提供的代碼,但它仍然給我提供了同樣的錯誤'不能反序列化當前的JSON對象(例如{「name」:「value」})到'System'類型中。 Collections.Generic.List'1 [ClientSample.Product]',因爲該類型需要一個JSON數組(例如[1,2,3])才能正確地反序列化。 要修復此錯誤,請將JSON更改爲JSON數組(例如[1,2,3])或更改反序列化的類型,以使其爲正常的.NET類型(例如,不是像整數這樣的基本類型,也不是集合類型像一個數組或列表),可以從JSON對象中反序列化。' – faisal1208

+0

您是否在情況2中調用方法'GetAllProductsAsync':? –

+0

在調試代碼時,路徑又是'api/product/2'。是的,我在案例2中調用'GetALLProductAsync'。另外'列表產品=新列表();'計數爲零 – faisal1208

相關問題