[Web API] ASP.NET Web API簡單範例

在這篇文章中, 以下的小範例說明怎樣利用Web API回傳資料庫中的資料並以XML格式傳送。

事前準備:
Visual Studio 2010或以下的請先安裝ASP.NET MVC 4 (可到這裡下載)

實作:
  1. 建立WEB API專案:
    1. 在選單中選取"檔案"->新增專案, 選擇framework 為".NET Framework4", 然後選擇 "ASP.NET MVC 4 Web Application", 填寫名稱及選擇位置後按確定.

    2. 接下來會轉到New ASP.NET MVC 4 Project, 選擇Web API, View engine為Razor, 按"OK"

    3. 沒意外的話系統進入到開發畫面.
  2. 建立Model
    接下來建立一個Account Model物件, 用來表示Account資料如何組成.
    1. 在"方案總管"(Solution Explorer)中找到"Model"資料夾, 然後按右鍵->加入->類別


    2. 選擇 "類別", 輸入名稱"Accaoinfo.cs"後按確定.



    3. 在Model中輸入模型, 代碼如下

      1
      2
      3
      4
      5
      6
      
                  public int accaono { get; set; }
                  public string eco { get; set; }
                  public DateTime active_dt { get; set; }
                  public DateTime inactive_dt { get; set; }
                  public DateTime create_dt { get; set; }
                  public string description { get; set; }
      

  3. 建立Controller

    1. 在"方案總管"中打開Controllers資料夾, 把ValuesController.cs更名變成AccaoController.cs


    2. 打開AccaoController.cs, 會發現已經幫你實作了幾種方法, 分別為Get, Post, Put, Delete. 其中Get可傳回特定資料或全部資料.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      
              // GET api/values
              public IEnumerable<string> Get()
              {
                  return new string[] { "value1", "value2" };
              }
      
              // GET api/values/5
              public string Get(int id)
              {
                  return "value";
              }
      
              // POST api/values
              public void Post(string value)
              {
              }
      
              // PUT api/values/5
              public void Put(int id, string value)
              {
              }
      
              // DELETE api/values/5
              public void Delete(int id)
              {
              }
      
      
    3. 由於這個例子只需要回傳所有帳戶資料, 所以只用到第一個方法. 其他方法先放著不管. 為了使人比較容易看懂, 把Get()的名稱改為GetAllAccaos(), 把IEnumerable<string> 改為IEnumerable<accao>, 意思就是說使用 IEnumerable<accao>傳回整個accao物件的list.那IEnumerable又是什麼呢? 大概意思就像foreach一樣, 可以幫你產生N個accao物件的序列(List), 詳細一點的解釋可以參考這裡[1], 總之在這個例子就是要產生一堆Account的List, 就這麼簡單.
    4. 接下來當然要在GetAllAccaos() 方法中寫點查詢資料庫的code, 如下:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      
              public IEnumerable<accao> GetAllAccaos()
              {
                  SqlConnection thisconnection = new SqlConnection();
                  thisconnection.ConnectionString = @"Data Source=xxx.xxx.xxx.xxx;Initial Catalog=xxxx;Persist Security Info=True;user ID=xxxx;Password=xxxx";
                  thisconnection.Open();
      
                  string sqlstr = " SELECT A.ACCAO_NO, A.ECO_NO, A.ACTIVE_DATE, A.INACTIVE_DATE, A.CREATE_DATE, PDV.CHI_DISPLAY_VALUES+' '+PDV.POR_DISPLAY_VALUES 'DISPLAY_VALUES' " +
                                      " FROM ACCAO A, PROJECT_DISPLAY_VALUES PDV " +
                                      " WHERE A.PROJECT_DISPLAY_NO = PDV.PROJECT_DISPLAY_NO ";
      
                  SqlCommand cmd = new SqlCommand(sqlstr, thisconnection);
                  SqlDataReader dr = cmd.ExecuteReader();
                  DataSet ds = new DataSet();
                  if (dr.Read())
                  {
                      dr.Dispose();
                      SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                      adapter.Fill(ds);
                  }
      
                  List<accao> list = new List<accao>();
                  foreach (DataRow r in ds.Tables[0].Rows )
                  {
                      list.Add(new accao{ accaono= int.Parse(r[0].ToString()),eco=r[1].ToString(), active_dt = DateTime.Parse(r[2].ToString()), inactive_dt = DateTime.Parse(r[3].ToString()), create_dt = DateTime.Parse(r[4].ToString()), description = r[5].ToString()});
                  }
      
                  return list;         
              }
      
      
    5. 這樣GetAllAccaos()就可以回傳Accao物件的序列了(list), 按下F5試跑跑看, 會出現以下畫面, 這個畫面實際上只是Controllers中HomeController.cs這個範例Class.

    6. 要真正使用Web API, 必須為每一項服務定義一個Uri. 在開發WebAPI的時候系統會自動為你的服務建立Uri, 例如這個回傳accao的例子api路徑是http://localhost:xxxx/api/accao/ 只要在任何browser輸入以上路徑, 就會回傳一個JSON或XML的結果 (抱歉檔案內容不能公開 XD),
      大概像Microsoft官方的例子:
      [{"Id":1,"Name":"Tomato soup","Category":"Groceries","Price":1.39},{"Id":2,"Name":
      "Yo-yo","Category":"Toys","Price":3.75},{"Id":3,"Name":"Hammer","Category":
      "Hardware","Price":16.99}]
      至於XML的話大概長這樣


    7. 這樣一隻簡單的Web API就完成了. 在進行系統開發的時候可以在你的系統中利用http協定呼叫服務, 就會回傳相對應的資料, 對於不同系統瀏覽同一data source也不用在每一個系統重新開發瀏覽資料用的元件了.

下一次會分享一下資料傳送加密的問題 ^__^


參考資料:
[1][.NET]快快樂樂學LINQ系列前哨戰-IEnumerable, IEnumerable<T>與Enumerable http://www.dotblogs.com.tw/hatelove/archive/2012/05/24/linq-enumerable-extension-method.aspx

Popular posts from this blog

[SQL SERVER] 找出LOCK方法懶人包

[SQL Server] 解決log檔(ldf file)過度膨脹的實戰經驗

[開箱] Dell P2415Q 4K螢幕開箱