none
請教Web API RRS feed

  • 問題

  • 各位老師好
    最近在看學習Web API,
    這幾天google 了一些網站了解一下,但還是不是很了解其往後可能可以怎應用
    https://dotblogs.com.tw/jovepaterlab/2017/06/02/004728
    https://dotblogs.com.tw/jasonyah/2013/05/17/use-asp_net-web-api-do-crud

    公司往後ERP系統可能需要跟外部WEB整合,系統新增的基本資料需丟給外部WEB(這是目前公司剛在使用WEB應用系統) 
    可能用ASP.NET C# + .Net framework開發一個 Web API 來自用
    或者提供 Web API 讓第三方(例如,手機App)呼叫
    以及需要串接其他第三方 Web API 來使用
    請教該如何有系統的學習,以達成以上可能的目標,謝謝



    2019年9月29日 上午 03:34

解答

  • 1、您的delete及update 當中的Route內容,須要加入Delete及Update ? 

    在WebAPI這邊的開發是沒必要的
    您不必這麼做
    我是刻意在網址中加上,目的是呼叫的那邊,可以看到網址就知道在做什麼
    這只是個人的習慣

    2、Controller的程式是用ADO.NET寫法可以吧?

    資料存取的部分,不建議寫在Controller中唷
    Controller, Model各有各的職責
    Controller做好承接呼叫與傳回
    Model則負責資料的類別、商業邏輯與資料處理
    我自己是把資料存取、商業邏輯寫在另一個專案中,這個專案加入參考後引用
    建議不要寫在Controller中
    至於資料處理,要用ADO.NET, LINQ, Entity FramewWork, Dapper 都可
    用您習慣的方式寫就好,但不要寫在Controller中

    3、新增和更新、查詢和刪除的Route一樣,是否就是用HTTP方法區分?

    是的,主要還是透過Method來判別
    預設沒有指定,他會是用get

    4、不知怎寫程式測試,是否有文件參考,還是用測試工具即可 

    Client端可以用jQuery的ajax,但要注意CORS的問題
    Server端可以用WebClient物件去呼叫
    但還是推薦用工具是最方便的
    小喵我自己的做法是,即使我最後要寫程式呼叫WebAPI
    我也都先用工具,把呼叫的過程完整測試過一遍,還包括正確呼叫與錯誤呼叫
    然後才會去寫程式呼叫。

    5、可否大概講一下您的Route設定的內容,有中括號及沒有代表什麼意思?

    中刮號代表的是參數
    您可以觀察小喵的範例中,Route網址中的中刮號,他的名稱與後面Function的參數是一模一樣的。

    例如這個:

    [Route("api/Ship/Delete/{sShipperID}")] 
             [HttpDelete] 
             public void Delete(Int32 sShipperID) 

    sShipperID他就是後面Delete這個function的參數


    以上提供您參考


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 effor 2019年10月2日 上午 08:44
    2019年10月2日 上午 07:22
    版主
  • 其實沒那麼複雜

    1. 本機執行起來
    2. 下中斷點
    3. 然後把API執行起來

    就醬子

    您參考一下以下的短影片

    https://www.youtube.com/watch?v=ufpnfL5q9R8


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 effor 2019年10月4日 上午 01:32
    2019年10月3日 上午 09:47
    版主
  • 因為我試過會出現405不允許…的status code

    405應該是您的Method下錯了
    我不知道您的程式碼,也不知道測試是怎麼進行的
    只能告知方向

    學習WebAPI,您需要好好理解『http status code』

    因為有問題要處理時,他是重要的線索

    請參考

    Http Status Code

    ------

    還有就是輸入網址http://localhost:49283/emp/api/AAA 預設會下載json檔案
    
    請問該怎樣才能呈現xml ,瀏覽器是IE...謝謝您

    要傳回JSON還是XML,取決於Client端要求的時候,其中的一個設定『Content Type』
    這個在WebAPI也是很重要的,請參考:

    https:WebAPI DataFormat Content Type

    不同瀏覽器有不同預設的ContentType,用Chrome預設是xml,IE預設是JSON

    您還在用IE,還沒開始用工具嗎?
    盡快使用工具來測試

    另外,這樣一問一答的學習很片面,比較推薦您找本WebAPI的專書,或者MVC的書裡面有詳細介紹WebAPI的部分,去做系統性的學習,對您會比較好。

    加油


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    2019年10月4日 上午 02:12
    版主
  • 我有一陣子沒看WebAPI的相關書
    之前我學WebAPI的時候,沒有專書在講
    只有MVC的書裡面有章節提到
    但現在好像有些書有在專門介紹WebAPI
    比較建議您去電腦用書的書局去找找看,翻翻看

    這邊就不特別說哪一本了

    之前有看到SkillTree有針對WebAPI有開課
    講師是對WebAPI很有研究的MVP
    如果未來有開課,推薦您去上課
    SKillTree的網址小喵的部落格有連結,您可以去看看

    ----

    Dapper應該沒有專門的書
    小喵之前有一篇整理的筆記
    大概小喵自己會用到的情境都整理在裡面
    推薦您參考看看
    [筆記]好用輕量型ORM神器--Dapper


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    2019年10月4日 上午 07:49
    版主

所有回覆

  • 建立一個Web API專案的教學可以看這一篇:

    Get Started with ASP.NET Web API 2 (C#)

    完整的Web API開發教學可以看這一篇:

    ASP.NET Web API Tutorials

    2019年9月29日 上午 04:08
  • 建立一個Web API專案的教學可以看這一篇:

    Get Started with ASP.NET Web API 2 (C#)

    完整的Web API開發教學可以看這一篇:

    ASP.NET Web API Tutorials

    謝謝老師

    我目前在練習實作CRUD功能

    已經可以GET、UPDATE,但無法POST 可否請幫忙查看,謝謝

    另請問

    1、輸入網址是否只能適用在GET查詢資料用? 其它如POST、PUT、DELETE要測試結果,只能用Postman或fiddler ?

    2、測試GET查詢資料,Controller裡面的程式已修改,但測試的查詢結果還是舊的,有重建方案及重啟iis

         看到的結果還是舊的?

    謝謝!

    我的WebApiConfig

     public static void Register(HttpConfiguration config)
            {
                // Web API 設定和服務

                // Web API 路由
                config.MapHttpAttributeRoutes();

                config.Routes.MapHttpRoute(
                    name: "GetApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );

                config.Routes.MapHttpRoute(
                   name: "UpdateApi",
                   routeTemplate: "api/{controller}/{id}/{gen02}/{gen03}",
                   defaults: new { id = RouteParameter.Optional }
               );

                config.Routes.MapHttpRoute(
                    name: "InsertApi",
                    routeTemplate: "api/{controller}/{id}/{gen02}/{gen03}",
                    defaults: new { id = RouteParameter.Optional }
                ); 
            }

    Controller內容命名如下:

    public string Get(int id) -->OK

    public string PutEmp(string id, string gen02, string gen03) -->OK

    public string PostEmp(string id, string gen02, string gen03) -->NG


    2019年10月1日 上午 10:07
  • 1) 是

    2) 錯誤訊息是什麼? 可以用偵錯工具追蹤看看為什麼會讀到不正確的內容?

    2019年10月1日 上午 11:27
  • 您好

    看您把Route集中寫在一起

    這是比較早期WebAPI的寫法
    當您的Controller很多很多,這樣對照起來、維護起來就會是一個很恐怖的情況
    尤其是兩邊要互相搭配與呼應的情況下

    新的寫法已經可以把Route的設定,寫在Controller裡面
    (也沒有很新,VS2015 WebAPI 2就是這樣的寫法)

    就像以下醬子

             // GET: api/Ship 
             [Route("api/Ship")] 
             [HttpGet] 
             public List<SShipper1.ShipperInfo> GetShips() 
             { 
                 try 
                 { 
                     CShipperObj dao = new CShipperObj(); 
                     List<SShipper1.ShipperInfo> oShips = dao.GetShips(); 
                     return oShips; 
                 } 
                 catch (Exception ex) 
                 { 
                     ErrMsgInfo oErr = new ErrMsgInfo(); 
                     oErr.ex = ex; 
                     HttpResponseMessage RepMsg = oErr.RepMsg; 
                     throw new HttpResponseException(RepMsg); 
                 } 
             } 
      
             //GET: api/Ship/5 
             [Route("api/Ship/{sShipperID}")] 
             [HttpGet] 
             public SShipper1.ShipperInfo GetShipByPK(Int32 sShipperID) 
             { 
                 try 
                 { 
                     CShipperObj dao = new CShipperObj(); 
                     SShipper1.ShipperInfo oShip = dao.GetShip(sShipperID); 
                     return oShip; 
                 } 
                 catch (Exception ex) 
                 { 
                     ErrMsgInfo oErr = new ErrMsgInfo(); 
                     oErr.ex = ex; 
                     HttpResponseMessage RepMsg = oErr.RepMsg; 
                     throw new HttpResponseException(RepMsg); 
                 } 
             } 
      
             [Route("api/Ship/pagging/{PageNum}/{PageSize}")] 
             [HttpGet] 
             public ShipperPageInfo GetShipsByPage(short PageNum, short PageSize) 
             { 
                 ShipperPageInfo oSSP = new ShipperPageInfo(); 
                 try 
                 { 
                     string orderByField=""; 
                     string orderByDirection=""; 
      
                     if (Request.Headers.Contains("orderByField")) { 
                         orderByField = Request.Headers.GetValues("orderByField").First(); 
                     } 
                     if (Request.Headers.Contains("orderByDirection")) 
                     { 
                         orderByDirection = Request.Headers.GetValues("orderByDirection").First(); 
                     } 
      
                     CShipperObj dao = new CShipperObj(); 
                     List<SShipper1.ShipperInfo> oShipPage = dao.GetShipsByPage(PageNum,PageSize,orderByField, orderByDirection); 
                     oSSP.oPages = oShipPage; 
      
                     short TotalPage = dao.GetShipsTotalPageByPageSize(PageSize); 
                     oSSP.TotalPage = TotalPage; 
      
                     return oSSP; 
      
                 } 
                 catch (Exception ex) 
                 { 
                     ErrMsgInfo oErr = new ErrMsgInfo(); 
                     oErr.ex = ex; 
                     HttpResponseMessage RepMsg = oErr.RepMsg; 
                     throw new HttpResponseException(RepMsg); 
                 } 
             } 
      
              
             // POST: api/Ship 
             [Route("api/Ship")] 
             [HttpPost] 
             public void Post([FromBody]SShipper2.ShipperInfo oShip) 
             { 
                 try 
                 { 
                     CShipperObj dao = new CShipperObj(); 
                     string rc = dao.InsertShip(oShip); 
                 } 
                 catch (Exception ex) 
                 { 
                     ErrMsgInfo oErr = new ErrMsgInfo(); 
                     oErr.ex = ex; 
                     HttpResponseMessage RepMsg = oErr.RepMsg; 
                     throw new HttpResponseException(RepMsg); 
                 } 
             } 
      
             // PUT: api/Ship/5 
             [Route("api/Ship/Update")] 
             [HttpPut] 
             public void PutValue([FromBody]SShipper2.ShipperInfo oShip) 
             { 
                 try 
                 { 
                     CShipperObj dao = new CShipperObj(); 
                     string rc = dao.ChgShip(oShip); 
                 } 
                 catch (Exception ex) 
                 { 
                     ErrMsgInfo oErr = new ErrMsgInfo(); 
                     oErr.ex = ex; 
                     HttpResponseMessage RepMsg = oErr.RepMsg; 
                     throw new HttpResponseException(RepMsg); 
                 } 
      
             } 
      
             // DELETE:  
             [Route("api/Ship/Delete/{sShipperID}")] 
             [HttpDelete] 
             public void Delete(Int32 sShipperID) 
             { 
                 try 
                 { 
                     CShipperObj dao = new CShipperObj(); 
                     string rc = dao.DelShip(sShipperID); 
                 } 
                 catch (Exception ex) 
                 { 
                     ErrMsgInfo oErr = new ErrMsgInfo(); 
                     oErr.ex = ex; 
                     HttpResponseMessage RepMsg = oErr.RepMsg; 
                     throw new HttpResponseException(RepMsg); 
                 } 
             } 
      

    因此想請教,不知道您的開發工具是什麼版本

    個人鼓勵您用醬子的寫法,會比較容易懂,也比較容易維護

    ----

    另外PostMan ,Restlet 之類的Chrome外掛,或者 fiddler

    這些都是很好測試API的工具
    瀏覽器輸入網址按Enter他就是get
    其他的Method,不透過這樣的工具當然也行,您可以自己寫程式去測試

    不過有工具使用起來方便很多
    我自己是習慣用Restlet Client
    測試的一些動做行為還可以記測試的一些動做行為還可以記錄下來
    下次要進行相關的測試都可以直接把之前的取出直接測試,很方便的

    查看網路文章注意一下日期、版本
    如果查到是比較舊的,您可以翻翻較新的文章寫法上有什麼不同,比較看看
    比較不會被歷史的版本影響您的學習

    加油


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    2019年10月2日 上午 01:40
    版主
  • 謝謝喵老師的回覆

    我是用VS2013 新增專案Web API ,加入具有讀取/寫入動作的Web API2控制器

    依您的說明,目前已經可以了,是否可以請您幫忙看一下是否有其它問題,謝謝您

    想再請教

    1、您的delete及update 當中的Route內容,須要加入Delete及Update ? 

    2、Controller的程式是用ADO.NET寫法可以吧?

    3、新增和更新、查詢和刪除的Route一樣,是否就是用HTTP方法區分?

    4、不知怎寫程式測試,是否有文件參考,還是用測試工具即可 

    5、可否大概講一下您的Route設定的內容,有中括號及沒有代表什麼意思? 同第1個問題

    -----------------------------------

    Web API為預設沒有修改

     config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );

    查詢資料ok(其中id為員工代號) 

    [Route("api/Emp/{id}")]
    [HttpGet] 
    public string Get(int id)

    新增員工資料ok

     [Route("api/Emp/{id}/{gen02}/{gen03}")]
     [HttpPost]
     public string Post(string id, string gen02, string gen03)

    更新員工資料ok        

      [Route("api/Emp/{id}/{gen02}/{gen03}")]
      [HttpPut] 
      public string Put(string id, string gen02, string gen03)

     

    刪除員工資料ok

    [Route("api/Emp/{id}")]
     [HttpDelete] 
     public string Delete(string id)


    2019年10月2日 上午 03:59
  • 1) 是

    2) 錯誤訊息是什麼? 可以用偵錯工具追蹤看看為什麼會讀到不正確的內容?

    謝謝this老師

    第2個問題,另外再新增專案後已正常,謝謝

    2019年10月2日 上午 04:03
  • 1、您的delete及update 當中的Route內容,須要加入Delete及Update ? 

    在WebAPI這邊的開發是沒必要的
    您不必這麼做
    我是刻意在網址中加上,目的是呼叫的那邊,可以看到網址就知道在做什麼
    這只是個人的習慣

    2、Controller的程式是用ADO.NET寫法可以吧?

    資料存取的部分,不建議寫在Controller中唷
    Controller, Model各有各的職責
    Controller做好承接呼叫與傳回
    Model則負責資料的類別、商業邏輯與資料處理
    我自己是把資料存取、商業邏輯寫在另一個專案中,這個專案加入參考後引用
    建議不要寫在Controller中
    至於資料處理,要用ADO.NET, LINQ, Entity FramewWork, Dapper 都可
    用您習慣的方式寫就好,但不要寫在Controller中

    3、新增和更新、查詢和刪除的Route一樣,是否就是用HTTP方法區分?

    是的,主要還是透過Method來判別
    預設沒有指定,他會是用get

    4、不知怎寫程式測試,是否有文件參考,還是用測試工具即可 

    Client端可以用jQuery的ajax,但要注意CORS的問題
    Server端可以用WebClient物件去呼叫
    但還是推薦用工具是最方便的
    小喵我自己的做法是,即使我最後要寫程式呼叫WebAPI
    我也都先用工具,把呼叫的過程完整測試過一遍,還包括正確呼叫與錯誤呼叫
    然後才會去寫程式呼叫。

    5、可否大概講一下您的Route設定的內容,有中括號及沒有代表什麼意思?

    中刮號代表的是參數
    您可以觀察小喵的範例中,Route網址中的中刮號,他的名稱與後面Function的參數是一模一樣的。

    例如這個:

    [Route("api/Ship/Delete/{sShipperID}")] 
             [HttpDelete] 
             public void Delete(Int32 sShipperID) 

    sShipperID他就是後面Delete這個function的參數


    以上提供您參考


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 effor 2019年10月2日 上午 08:44
    2019年10月2日 上午 07:22
    版主
  • 非常謝謝喵老師的說明

    1、您的delete及update 當中的Route內容,須要加入Delete及Update ? 

    我已有試以下ok,的確在呼叫時比較方便區分要做什麼

    [Route("api/Emp/Delete/{id}")]
    [HttpDelete]
    http://..../website/api/emp/delete/AA

    [Route("api/Emp/Update/{id}/{gen02}/{gen03}")]
    [HttpPut]

    http://.../website/api/emp/update/AA/AABB/AABB

    2、Controller的程式是用ADO.NET寫法可以吧?

    糟糕,
    我在Model有寫一個類別來回傳DateTable 
    在Controller的Get Mothod寫ADO.NET 來處理查詢是否有此員工資料
    不能寫在Controller的話,請問該怎寫呢?
    那Controller的內容應該放什麼才是ok的
    還是如您說的呼叫引用寫好的專案裡面的方法

    4、不知怎寫程式測試,是否有文件參考,還是用測試工具即可 

    目前我練習了CRUD的方法,是否代表我在Server端建好了Web API
    可以用Postman工具來呼叫 ?

    如果以上我比較ok了後,
    是否再跟您請教
    Client端可以用jQuery的ajax,但要注意CORS的問題
    Server端可以用WebClient物件去呼叫 ?

    就是Client端怎去呼叫WebAPI
    Server端怎去呼叫WebAPI ? 是這樣說嗎?

    以上謝謝您


    2019年10月2日 上午 09:26
  • 我在Model有寫一個類別來回傳DateTable 
    在Controller的Get Mothod寫ADO.NET 來處理查詢是否有此員工資料
    不能寫在Controller的話,請問該怎寫呢?
    那Controller的內容應該放什麼才是ok的
    還是如您說的呼叫引用寫好的專案裡面的方法

    小喵找了一篇小喵之前的文章
    這裡面有比較完整的WebAPI的範例
    包含Controller, Model的相關寫法
    資料存取,我是用Dapper為主,ADO.NET為輔
    文章中有連結可以看一下Dapper的介紹
    搭配WebAPI很是方便

    建議您參考看看(前半部的部分),後面angular的部分您可以暫時先忽略

    https://dotblogs.com.tw/topcat/2017/02/10/133746

    至於是否切出專案分層,這部分要講又是另一個蠻大的課題
    如果剛開始練習,您可以先在一個專案中處理就好
    但還是強調,別在Controller中寫資料存取

    ----

    目前我練習了CRUD的方法,是否代表我在Server端建好了Web API
    可以用Postman工具來呼叫 ?

    是的
    不只可以用PostMan來呼叫
    還可以在Controller或者Model中下中斷點,然後F11可以Step By Step的執行偵錯

    這部分建議您一定要試試看

    ^_^

    加油


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    2019年10月2日 上午 09:49
    版主
  • 喵老師您好

    還可以在Controller或者Model中下中斷點,然後F11可以Step By Step的執行偵錯

    --> 

    Web API 怎麼debug也是我想請問的,

    但我在vs2013按F11 後,結果出現如下圖,麻煩請幫忙看一下,謝謝您


    2019年10月3日 上午 02:03
    1. 專案要設定在除錯模式中
    2. WebAPI執行在IIS Express中,並讓他執行起來
    3. 用PostMan測試是否可以呼叫WebAPI順利執行
    4. 在Controller中下中斷點
    5. 用PostMan再次呼叫WebAPI,看程式是否可以停在中斷點
    6. 按F11,逐步執行

    大概是醬子的流程


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    2019年10月3日 上午 03:42
    版主
  • 喵老師您好

    不好意思,還真的不了解

    按F5就會進到http://localhost:49283/ 的網頁,然後用PostMan是可以呼叫WebAPI

    但不會停在中斷點

    1、專案要設定在除錯模式中

    2、WebAPI執行在IIS Express中,並讓他執行起來

    是否設定如下圖?  謝謝

    2019年10月3日 上午 07:01
  • 其實沒那麼複雜

    1. 本機執行起來
    2. 下中斷點
    3. 然後把API執行起來

    就醬子

    您參考一下以下的短影片

    https://www.youtube.com/watch?v=ufpnfL5q9R8


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 effor 2019年10月4日 上午 01:32
    2019年10月3日 上午 09:47
    版主
  • 喵老師您好

    我用GET已經可以了,http://localhost:49283/emp/api/AAA

    想請再教一下是否只能用GET查詢資料,PUT、POST、DELETE就無法這樣用了?

    因為我試過會出現405不允許…的status code

    還有就是輸入網址http://localhost:49283/emp/api/AAA 預設會下載json檔案

    請問該怎樣才能呈現xml ,瀏覽器是IE...謝謝您

    2019年10月3日 下午 12:27
  • 因為我試過會出現405不允許…的status code

    405應該是您的Method下錯了
    我不知道您的程式碼,也不知道測試是怎麼進行的
    只能告知方向

    學習WebAPI,您需要好好理解『http status code』

    因為有問題要處理時,他是重要的線索

    請參考

    Http Status Code

    ------

    還有就是輸入網址http://localhost:49283/emp/api/AAA 預設會下載json檔案
    
    請問該怎樣才能呈現xml ,瀏覽器是IE...謝謝您

    要傳回JSON還是XML,取決於Client端要求的時候,其中的一個設定『Content Type』
    這個在WebAPI也是很重要的,請參考:

    https:WebAPI DataFormat Content Type

    不同瀏覽器有不同預設的ContentType,用Chrome預設是xml,IE預設是JSON

    您還在用IE,還沒開始用工具嗎?
    盡快使用工具來測試

    另外,這樣一問一答的學習很片面,比較推薦您找本WebAPI的專書,或者MVC的書裡面有詳細介紹WebAPI的部分,去做系統性的學習,對您會比較好。

    加油


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    2019年10月4日 上午 02:12
    版主
  • 喵老師您好

    謝謝您的回覆說明,

    因為我試過會出現405不允許…的status code

    -->我指是在visual studio執行後在IE輸入,我想應該是瀏覽器預設是GET方法

    因為輸入POST方法所以才會出現下圖

    我已經有用工具Postman及Fiddler測試POST、PUT、DELETE ok..

    最後請問是否有不錯的推薦的Web API及dapper的書或參考文件資料

    今天在了解學習dapper,謝謝您

    2019年10月4日 上午 06:57
  • 我有一陣子沒看WebAPI的相關書
    之前我學WebAPI的時候,沒有專書在講
    只有MVC的書裡面有章節提到
    但現在好像有些書有在專門介紹WebAPI
    比較建議您去電腦用書的書局去找找看,翻翻看

    這邊就不特別說哪一本了

    之前有看到SkillTree有針對WebAPI有開課
    講師是對WebAPI很有研究的MVP
    如果未來有開課,推薦您去上課
    SKillTree的網址小喵的部落格有連結,您可以去看看

    ----

    Dapper應該沒有專門的書
    小喵之前有一篇整理的筆記
    大概小喵自己會用到的情境都整理在裡面
    推薦您參考看看
    [筆記]好用輕量型ORM神器--Dapper


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    2019年10月4日 上午 07:49
    版主