Asp.Net MVC WebAPI的創建與前臺Jquery ajax後臺HttpClient調用詳解

来源:https://www.cnblogs.com/w5942066/archive/2018/11/14/9960659.html
-Advertisement-
Play Games

asp.net MVC Web API 由於項目需要好久沒有弄這些重溫一下,以前都覺得WebServers好用 誰知道技能更新換代實在太快,哈哈不學習就跟不上了 ...


1、什麼是WebApi,它有什麼用途?

          Web API是一個比較寬泛的概念。這裡我們提到Web API特指ASP.NET MVC Web API。在新出的MVC中,增加了WebAPI,用於提供REST風格的WebService,新生成的WebAPI項目和典型的MVC項目一樣,包含主要的Models、Views、Controllers等文件夾和Global.asax文件。Views對於WebAPI來說沒有太大的用途,Models中的Model主要用於保存Service和Client交互的對象,這些對象預設情況下會被轉換為Json格式的數據迚行傳輸,Controllers中的Controller對應於WebService來說是一個Resource,用於提供服務。和普通的MVC一樣,Global.asax用於配置路由規則,個人的理解MVC控制器中一般方法返回的是一個視圖而Api返回的是數據,可以是List、Json等格式。對於WebAPI來說它最初被設計為和WCF一樣的客戶埠、服務埠兩套結構我們到現在還沒有提到客戶埠是因為我們的請求別的方式來封裝成HTTP請求接收收HTTP相應的比如AJAX和Form表單提交。接下來我們用VS2017新建一個webApi項目。

2、打開VS2017 點文件-----> 新建---->項目。快捷鍵(Ctrl+Shift+N)

 Web裡面的Asp.Net Web 應用程式

上面一定要選Web API 。項目建好了 我先做一個從資料庫取出數據在調用的慄子。

3、在控制器文件夾右鍵---->添加---->控制器。選擇Web API2 Controller Empty點確定取名Customer  因為後面要操作資料庫這張表 ,點add完成

     這時候App_Satrt文件夾下麵多了一個文件WebApiConfig.cs,這個文件是它的路由

由於以前都是用原生的sql訪問資料庫  所以現在也說一下 原生的sql 在asp.net MVC中的使用不用EF連接 後面也使用EF

4、在Models文件夾下麵建立模型類Customer類與SqlDB類,這裡沒有分三層架構就簡單的寫在一起了理解就行(SqlDB類這裡有《Asp.Net中對操作Sql Server 簡單處理的SqlDB類》)

  public class Customer
    {
        //ID
        public int ID { get; set; }
        //姓名
        public string Name { get; set; }
        //學號
        public string Number { get; set; }
        //性別1男2女
        public int Sex { get; set; }
        //院系
        public string Department { get; set; }
        //專業
        public string Manjor { get; set; }
        //年級
        public int Class { get; set; }
        //聯繫方式
        public string Mobile { get; set; }

    }

 

 

在項目的web.config配置文件裡面一定要加資料庫連接字元串配置

 

<connectionStrings>
    <!--連接字元串-->
    <add name="SqlConn" connectionString=" Data Source=.;Initial Catalog=OneCardSystem;Integrated Security=True" />
  </connectionStrings>

 

5、在API控制器裡面寫個方法返回List類型的數據

這個API控制器一定是繼承ApiController這個控制器的

 public class CustomerController : ApiController
    {
        Customer customer = new Customer();
        public List<Customer> GetCustomerAll()
        {
            //sql語句
            string _sql = "Select * from Customer";
            //實例SqlDB類
            SqlDB sb = new SqlDB();
            //定義List儲存
            List<Customer> list = new List<Customer>();
            //獲取數據
            var data = sb.ExecuteDataSet(_sql).Tables[0].Rows;
            //遍歷data
            foreach(DataRow item in data)
            {
                var customer = new Customer()
                {
                    //對應欄位
                    ID = Convert.ToInt32(item["ID"].ToString()),
                    Number= item["Number"].ToString(),
                    Name= item["Name"].ToString(),
                    Manjor= item["Manjor"].ToString(),
                    Mobile= item["Mobile"].ToString()
                };
                //逐條添加到list裡面
                list.Add(customer);
            }
            //返回list
            return list;
        }
    }

 

       6、運行項目預設來到Home控制器所對應的視圖在地址欄後面加上/api/Customer/GetCustomerAll  就可以看到數據了   這個是在谷歌瀏覽器上面看到的結果,不同的瀏覽器有不同的效果 有時間自己試試看,API控制器訪問主要的就是在埠後面加上/api/控制器/方法名, 後面有參數的接上參數跟mvc一般的控制器我的理解就是就多了api的首碼

 

 7、現在在瀏覽器裡面可以直接調用這個api了 ,接下來在一個項目中Home所對應的Index視圖裡面我們用前臺技術(jQuery  getJSON)訪問調用一下試試

把引用的佈局我倒是刪除了,Views文件夾下麵的_ViewStart.cshtml 刪除了   Index.cshtml裡面的的內容也刪了 

 

代碼在下麵  別忘了引用JS

<!DOCTYPE html>
<html lang="en">
<head>
    <title>ASP.NET Web API</title>
    <script type="text/javascript" src="~/Scripts/jquery-3.3.1.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $.getJSON("/api/Customer/GetCustomerAll", function (data) {
               // console.log(data);
                $.each(data, function (key, val) {
                    $("#batMain").append("<tr><td>" + data[key].ID + "</td><td>" + data[key].Name + "</td><td>" + data[key].Number + "</td><td>" + data[key].Manjor + "</td><td><a class='tabEdit'>編輯</a>&nbsp;&nbsp;&nbsp;<a class='tabDele'>刪除</a></td></tr>");
                    Op();
                });
            });
            $("#btnSave").click(function () {
                var id = $("#txtID").val();
                var Name = $("#txtName").val();
                var Number = $("#txtNumber").val();
                var Manjor = $("#txtManjor").val();
                var customer = {
                    ID:id,
                    Name:Name,
                    Number:Number,
                    Manjor:Manjor
                }
                $.ajax({
                    type: "post",
                    url: "/api/Customer/Edit",
                    // data: { "id": id, "Name": Name, "Number": Number, "Manjor": Manjor },
                    data: JSON.stringify(customer),
                    contentType:"application/json",
                    success: function (data) {
                        console.log(data);
                    },
                    error: function () {
                    }
                });
            });
        });
        function Op() {
            var id = "";
            var row
            var tab = document.getElementById("batMain");
            var edit = $(".tabEdit");
            var dele = $(".tabDele");
            for (var i = 0; i < edit.length; i++) {
                edit[i].onclick = function () {
                    row = this.parentNode.parentNode.rowIndex;
                    id = $("#batMain tr:eq(" + row + ") td:eq(0)").html();
                    $("#txtID").val($("#batMain tr:eq(" + row + ") td:eq(0)").html());
                    $("#txtName").val($("#batMain tr:eq(" + row + ") td:eq(1)").html());
                    $("#txtNumber").val($("#batMain tr:eq(" + row + ") td:eq(2)").html());
                    $("#txtManjor").val($("#batMain tr:eq(" + row + ") td:eq(3)").html());
                }
            }
        }
    </script>
    <style type="text/css">
        table{width:100%;}
        table tr td{text-align:center; line-height:20px; height:25px; min-width:80px;  border:1px solid #d0cfcf;word-wrap:break-word;word-break:break-all;}
        a{list-style:none;font-size:12px;font-weight:600; color:#072af7;}
        a:hover{cursor:pointer}
        .trOne{background:rgb(202, 200, 212); line-height:40px; font-size:14px; font-weight:600;}
    </style>
</head>
<body id="body">
    <div style="width:90%; margin: 0 auto;">
        <h1>學生信息</h1>
        <table cellpadding="0" cellspacing="0">
            <tr>
                <td width="20%"><input type="text" id="txtID" readonly="readonly" /></td>
                <td width="20%"><input type="text" id="txtName" /></td>
                <td width="20%"><input type="text" id="txtNumber" /></td>
                <td width="20%"><input type="text" id="txtManjor" /></td>
                <td width="20%"><input type="button" id="btnSave" value="確定" /></td>
            </tr>
        </table>
        <table cellpadding="0" cellspacing="0" id="batMain">
            <tr class="trOne">
                <td width="20%">ID</td>
                <td width="20%">姓名</td>
                <td width="20%">學號</td>
                <td width="20%">專業</td>
                <td width="20%">操作</td>
            </tr>
        </table>
    </div>
</body>
</html>

 

 看看效果

 

 這裡的編輯刪除操作我還沒有做完,不過一般的asp.net mvc我裡面用的是ajax請求後臺  這個不是請求API只是處理一般的增刪查改,這裡記錄一下傳值的問題

dada裡面可以是// data: { "id": id, "Name": Name, "Number": Number, "Manjor": Manjor },這樣的格式 後臺獲取直接用Request["ID"]  這樣子就可以獲取了。也可以在方法裡面定義對應的參數 ,參數名要跟data裡面的一樣

也可以傳值成一個對象過去 data: JSON.stringify(customer), 這樣   後臺接收 var stream = HttpContext.Request.InputStream;     string JsonStr = new StreamReader(stream).ReadToEnd(); 然後自己解析一下

如果要在請求的API裡面傳參數我只能傳一個ID 其他的還沒有研究 要傳對象過去的話還要在方法裡面加上 ([FromBody] Customer ct)這樣

    8、在後臺通過HttpClient調用API 我做練習的時候是用兩個項目 一個運行著 另一個調用這個  現在我弄在一個項目裡面   用控制器來請求。新建一個控制器Show右鍵Index添加視圖Index.cshyml

  public class ShowController : Controller
    {
        // GET: Show
        public ActionResult Index()
        {
            //獲取埠
            string url= Request.Url.ToString();
            var httpClient = new HttpClient();
            var data= httpClient.GetAsync(url+ "api/Customer/GetCustomerAll").Result.Content.ReadAsStringAsync().Result;//調用API
            System.Web.Script.Serialization. JavaScriptSerializer Serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            List<Customer> objs = Serializer.Deserialize<List<Customer>>(data);//Json反序列化成List

            // Customer cs = JsonConvert.DeserializeObject<Customer>(cg.ReturnData);
            //, JsonRequestBehavior.AllowGet
            return View(objs);
        }
    }

 

視圖

 

 對應的代碼

@{
    ViewBag.Title = "Index";
}
@using WebApiTest.Models;
@model List<Customer>

<html lang="en">
<head>
    <title>調用API</title>
    <style type="text/css">
        table{width:100%;}
        table tr td{text-align:center; line-height:20px; height:25px; min-width:80px;  border:1px solid #d0cfcf;word-wrap:break-word;word-break:break-all;}
        a{list-style:none;font-size:12px;font-weight:600; color:#072af7;}
        a:hover{cursor:pointer}
        .trOne{background:rgb(202, 200, 212); line-height:40px; font-size:14px; font-weight:600;}
    </style>
</head>
<body id="body">
    <br />
    <div style="width:90%; margin: 0 auto;">

        <table>
            <tr class="trOne">
                <td width="20%">ID</td>
                <td width="20%">姓名</td>
                <td width="30%">學號</td>
                <td width="30%">專業</td>
            </tr>
            @{ 
                if(Model.Count>0)
                {
                    foreach(var item in Model)
                    {
                        <tr>
                            <td>@item.ID</td>
                            <td>@item.Name</td>
                            <td>@item.Number</td>
                            <td>@item.Manjor</td>
                        </tr>
                    }
                }
            }
        </table>
    </div>
</body>
</html>

 

 註意應用using System.Web.Script.Serialization; 沒有的話來這裡找

修改路由配置指向Show 控制器運行項目 你會看到

  9、遇到的問題:

如果這裡你要返回一個Json數據 記得添加 return(objs, JsonRequestBehavior.AllowGet) 寫成這樣 具體什麼錯我也忘記了 JsonResult也是一樣的new 的時候一樣的添加後面的

如果在不同的項目中調用還要在配置文件裡面加下麵的代碼 加在<system.webServer>裡面  實在寫API的項目的配置文件裡面

 

<!--跨域配置-->
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Max-Age" value="30" />
        <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
      </customHeaders>
    <tpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

 要是調試的時候出錯發現請求的路徑會自動的加上一個Home 在api前面記得在api裡面類名前面加 [RoutePrefix("Api/Customer")]

 

10、總結:本來的需求是要調用人家的API資料庫記錄調用的地址、時間、返回的數據這些,就先弄弄,EF、Linq拉姆達這些後面有時間在弄吧 我弄了一點不是很理解在這裡還是個小白,以前都是用原生的Sql語句寫的現在都不用了,只能慢慢學了。歡迎有緣看到的朋友指出不足,共同學習!好久沒有寫博客了,月到十五光明少,人到中年萬事休。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本項目是一個通用響應式管理後臺,導入開發環境安裝就能直接運行,界面也非誠漂亮,在PC端和移動端也是自適應的。非常適合企業或者個人搭建各種商城後臺,博客後臺,網站管理後臺等。 源碼啟動後的截圖 需要這套源碼的朋友聯繫作者微信(同電話):18629374628 ...
  • 一.ORM欄位 | 類型 | 說明 | | | | | AutoField | 一個自動增加的整數類型欄位。通常你不需要自己編寫它,Django會自動幫你添加欄位:\ ,這是一個自增欄位,從1開始計數。如果你非要自己設置主鍵,那麼請務必將欄位設置為\ 。Django在一個模型中只允許有一個自增欄位, ...
  • 引入模塊的方式: 1. import 模塊 2. from xxx import 模塊 一、collections 模塊 1.Counter() counter是一個計數器,主要用來計數,計算一個字元串中每個字元出現的次數 1 from collections import Counter 2 s ...
  • Python中的邏輯運算符 not, and, or and 與運算 兩者為真則為真 >>>True and True True 其中一個為假,則為假 >>>True and False False or 或運算 兩者為假則為假 >>>False or False False 其中一個為真,則為真 ...
  • ASP.NET -- 一般處理程式ashx 如果在一個html頁面向伺服器端請求數據,可用ashx作為後臺頁面處理數據。ashx適合用作數據後臺處理,相當於WebForm中的aspx.cs文件或aspx.vb文件。 入門案例:html頁面向ashx頁面請求數據,ashx作為後臺頁面返回數據。 前端h ...
  • 在上一篇博文《 "[UWP]不那麼好用的ContentDialog" 》中我們講到了ContentDialog在複雜場景下使用的幾個令人頭疼的弊端。那麼,就讓我們在這篇博文里開始愉快的造輪子之旅吧! 首先要向大家說明:這篇博文主要還是寫的構建Picker時的思考過程,如果不感興趣的,可以直接略過這篇 ...
  • 問題如圖所示: 解決辦法: 1. 啟動iis(internet information services)服務。 2. 打開左側網站列表=> 右鍵點擊自己配置的網站 => 點擊管理網站 => 點擊 瀏覽 3. 回到vs 重新打開進程列表,可以看到 w3wp.exe 進程已啟動。 ...
  • " 【.NET Core項目實戰 統一認證平臺】開篇及目錄索引 " 上篇文章我們介紹了2種網關配置信息更新的方法和擴展Mysql存儲,本篇我們將介紹如何使用Redis來實現網關的所有緩存功能,用到的文檔及源碼將會在GitHub上開源,每篇的源代碼我將用分支的方式管理,本篇使用的分支為 。 附文檔及源 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...