OData

範例檔案 : 20160411_webAPIODataModel.rar

Open Data Protocol (OData) 是微軟定義出來的網頁開放式資料協定,此協定支援 ATOM Publishing Protocol (AtomPub,XML) 及 JSON 格式等,在最新 OData 4.0 版本使用 REST 原則,近期被 OASIS (Organization for the Advancement of Structured Information Standards) 委員會所採納。 OData 支援資料模型的描述及根據資料模型的資料進行查詢與更新功能,協定的規則來自於 REST 規範,並透過既有的HTTP加上標準的CRUD (Create, Read, Update, Delete) 方式所組成。

採用架構


  • C#
  • ASP.NET 4.5.2
  • Web API 2.2
  • MVC 5
  • OData v4.0
  • Web.Odata
  • Entity Framework 6
    • Entity Framework (又稱ADO.NET Entity Framework) 是微軟以 ADO.NET 為基礎所發展出來的物件關聯對應 (O/R Mapping) 解決方案,早期被稱為 ObjectSpace,現已經包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 以上發表。
    • ADO.NET Entity Framework 以 Entity Data Model (EDM) 為主,將資料邏輯層切分為三塊,分別為 Conceptual Schema, Mapping Schema 與 Storage Schema 三層,其上還有 Entity Client,Object Context 以及 LINQ 可以使用。
    • LINQ (Language Integrated Query),是一項微軟技術,新增一種自然查詢的 SQL 語法到.NET Framework的程式語言中。
  • OData.Edm 6.14.0 (至少 6.5.0 版本以上)

常用指令


指令 說明 範例
top 挑出最前面的幾筆 ?$top=3
skip 略過幾筆。可用於分頁顯示 ?$skip=10
orderby 排序 ?$orderby=SupplierID,ProductID
filter 篩選
gt : > , 大於 $filter=ProductID gt 10
lt : < , 小於 $filter=ProductID lt 10
ge : >=, 大於等於 $filter=ProductID ge 10
le : <=, 小於等於 $filter=ProductID le 10
eq : =, 等於 $filter=ProductID eq 10
$filter=name eq 'f'
ne : <>, 不等於 $filter=ProductID ne 10

實作範例


透過 Web API MVC 連結資料庫中的資料表並實作出 OData RESTful Json 格式介面。

開始一個 VS 專案


  • 檔案 > 新增 > 專案 > 範本 > Visual C# > Web > ASP.NET Web 應用程式
  • 可以選擇是否採用 MVC 架構 : 本次採用 Web API 範本為例
    • Web API (已加入 MVC 及 Web API 核心參考) > 變更驗證 > 無驗證
    • Empty (至少需勾選 Web API 核心參考)

安裝所需 Packages


  • 路徑 : 工具 > NuGet 封裝管理員 > 套件管理器主控台
  • 使用 OData Packages :

    Install-Package Microsoft.AspNet.Odata
    
  • 使用 Web.Odata

    Install-Package Patches.System.Web.OData -Pre
    
  • 使用 OData.Edm

    Install-Package Microsoft.OData.Edm -Version 6.14.0
    
  • 使用 Entity Framework :

    Install-Package EntityFramework
    

使用的 Database 與 Table


  • 資料庫名為 ProductsContext,包含 two tables,OData 及 ODatas。
  • 資料庫為放置在 .\SQLEXPRESS 底下的資料庫,非 App_Data
  • 需注意若是此 Web API 需具備 POST 功能 (Created),對於 id 此辨識 key 要採取自動遞增的設定,否則會出現 500 Interal error,於 T-SQL 指令中,在 [id] 欄位下加入 IDENTITY(1,1),表示每次遞增 + 1。
  • OData 內容如下
CREATE TABLE [dbo].[OData] (
    [id]   INT           IDENTITY(1,1) NOT NULL,
    [name] NVARCHAR (50) NOT NULL,
    CONSTRAINT [PK_OData] PRIMARY KEY CLUSTERED ([id] ASC)
);
id name
1 a
2 b
3 c
  • ODatas : 為 SetInitializer 自動產生,內容可以參考下述。
CREATE TABLE [dbo].[ODatas] (
    [Id]   INT           NOT NULL,
    [name] NVARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
Id name
1 a
2 f
3 e
4 11

加入 Model


微軟官網上定義 「A model is an object that represents a data entity in your application.」,指出 model 就是與資料處理個體有關。

  • 右鍵點擊 Models 資料夾 > 加入 > 類別 (C# Class) > 取名為 ODATA (ODATA.cs)
註解
一般而言,處理資料模型會將 class 放置在 Models folder,但並不強制如此作法。
  • 加入下方類別成員定義
// ODATA is the class used by C#, 
// the member must be the same with columns of the table in database
// [Table("OData")] is used to specify the table already existing
// the name must be the same with table in the database
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace webAPIODataModel.Models {
    [Table("OData")]
    public class ODATA
    {
        // id is the key
        public int id { get; set; }
        public string name { set; get; }
    }
}
  • 類別定義說明
    • 此類別的定義主要由 C# 使用
    • 而被定義成員需與資料庫中要使用的 table 的 column 名字相同
    • 其中 [Table("OData")] 用來標示要讀取資料庫中哪一張表,需與繼承 DbContext 的類別中 SetInitializer 共同使用
    • 若是該資料庫中沒有此張表,則不需加上 [Table("OData")],則 DBSet 會在第一次被要求存取時自動產生一張表,而之後便會利用此張表當作 API 存取對象
    • 其中成員 Id 是搜尋物件的 Key,Clients 可以透過此 Key 進行 Query。舉例而言,要找到物件 Product 中 Id 為 5 的搜尋方式,可以透過 URI 為 /Products(5) 來達成,而 Id 亦是後端資料庫的主要 Key (Primary Key)。
    • 若是利用 DBSet 於第一次進行表格的創建,則亦可以透過 Seed 方式,先將一部分資料先行存入
      protected override void Seed(DBContextClass context) { 
      ... 
      }
      

開啟 Entity Framework


本次的範例將會使用 Entity Framework (EF) Code 來產生後端資料庫

註解
Web API Odata 可以不需要 EF,而是可以使用任何能轉換資料庫成資料模型 (models) 的資料鍵階層 (data-access layer) 皆能做為 OData 使用的 entity。
  • 若是使用 Entity Framework,需要確認已安裝所需 Package (如上述步驟安裝 Entity Framework)

    Install-Package EntityFramework
    
  • 開啟 Web.config 檔案,將下列連接字串加入 Configuration 元素中,在 configSections 元素之後加入。

  • 其中 ProductsContext 將在之後被繼承 DbContext 的類別所引用
  • .\SQLEXPRESS 為本機使用之 Database server
<configuration>
  <configSections>
    <!-- ... -->
  </configSections>

  <!-- Add this: -->
  <connectionStrings>
    <add name="ProductsContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Product;Persist Security Info=True;User ID=odata;Password=odata" providerName="System.Data.SqlClient" />
  </connectionStrings>
  • 這項設定透過一連接字串指示要連入本機端 DB (LocalDB)。這資料庫在運行本機 APP 時會被用到。

  • 下一步,加入名為 ODATACONTENT 類別,並加入下方類別定義。此類別繼承 DbContext,並於物件創造時便會連接資料庫。

註解
此 ODATACONTENT 類別可以獨立於 Model 資料夾成為 ODATACONTENT.cs,尤其當連接的表格很多時,可獨立成連接資料庫中不同的 Table 的類別,但並不強迫;亦可以直接將連接資料庫的此類別直接寫入與 ODATA class 相同的 namespace 中。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace webAPIODataModel.Models {
    // Use DbContext to load the whole database
    // or load the collection of multiple tables
    public class ODATACONTENT : DbContext {
        // after initializing the object
        // the object directly links the database though connectionString defined in Web.config
        // the format "name=(connection string name)"
        public ODATACONTENT() : base("name=ProductsContext") {
            // condition.1 : existing table
            // if the table already existing in the database, it is not necessary to create a new table in it
            // the SetInitializer load the DbContext and set null to initialization
            Database.SetInitializer<ODATACONTENT>(null);

            // condition.2 : no table
            // But if you created the database yourself, no table in it
            // then you need to specify an initialization strategy otherwise no tables will be added to the database
            // in the most case, the VS might do the thing automatically, the following code would be no need
            //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ODATACONTENT>());
        }

        // DbSet loads tables in the database and also is the interface to execute CRUD operations
        // <ODATA> is the class defined in C# to map the datatype to the table in the database
        // OData is the "table name" in the database
        public DbSet<ODATA> OData { get; set; }
    }
}
  • 類別定義說明

    • 其中建構子 ProductsContext() 中定義 base 的 "name=ProductsContext" 需指向 connectionStrings。
    • 繼承 DbContext 目地為載入整個資料庫或者是載入含有多張表的資料集
    • 於物件被產生時,便會直接透過 Web.config 定義的 connectionString 連接至資料庫;而 base("name=ProductsContext") 便是找出在 web.config 中定義名為 ProductsContext 的 connectionString,此 base("name=[連接字串名稱]") 為規定寫法。
    • 若是資料庫中已有需要引用的表,則並不需要再創建一張表,因此 SetInitializer 為 null,而此程式碼需與資料類別定義 [Table("OData")] 一起使用,即

      Database.SetInitializer<ODATACONTENT>(null);
      
    • 但若是資料庫中沒有此張表,則 visual studio 便會於第一次被呼叫時,將此表自動產生;但若沒有自動產生,則透過透過下方程式碼將之產生。

      Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ODATACONTENT>());
      
    • DBSet 目地為在入資料庫中的表,並作為 CRUD 的操作介面,其中 <ODATA> 是 C# 中被定義來對應資料表各欄位名稱(包含其資料型態),而 OData 則是 C# 中表示 DBSet 物件的變數名稱,此可以變動。

OData Endpoint 的組態設定


  • 開啟檔案 App_Start/WebApiConfig.cs,加入下方使用的函式庫的程式碼
//較不建議使用,因 OData 4.0 版本與現行 OData MVC 3.0 版本有衝突,可能造成  error 406 問題
//using System.Web.OData.Builder;
//using System.Web.OData.Extensions;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.OData.Builder;
using webAPIODataModel.Models;
  • 加入下方程式碼入 Register method 來註冊路由器

    public static class WebApiConfig
      {
          public static void Register(HttpConfiguration config)
          {
              // Web API 設定和服務
    
              // Web API 路由
              config.MapHttpAttributeRoutes();
    
              // OData setting
              // use ODataConventionModelBuilder to set the entity and model
              ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    
              // builder.EntitySet must be the same with data model definition
              // <ODATA> is the class defined by C# to map tables in database
              // EntitySet<ODATA>("OData1"), OData1 means the execution body and must be the same with controller's name
              // EntitySet loads the OData into ODATA Class
              // Because OData v3 (Controller) is not compatible with OData v4 (Web API)
              // config.MapODataServiceRoute might cause 406 (Not Acceptable), so config.Routes.MapODataRoute might be better
              builder.EntitySet<ODATA>("OData1");
              config.Routes.MapODataRoute(
                  routeName: "ODataRoute",
                  routePrefix: "ODataPrefix",
                  model: builder.GetEdmModel()
              );
    
              // general routing
              config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
          }
      }
    
  • 此 Code 作了下列兩件事

    • 創造出 Entity Data Model (EDM) : EDM 是資料模型的摘要 (abstract model of the data),被用來產生此服務的中介資料內容 (metadata document)。類別 ODataConventionModelBuilder 可以透過預設命名轉換創造出一個 EDM。此方法可以省略很多步驟,程式碼相對少很多。而若是希望能對 EDM 有更多的控制,則可以使用 ODataModelBuilder 類別來達成,其可以透過加入特性 (properties)、索引 (Keys) 及導覽開放成員特性 (navigation properties explicitly) 等。

    • 加入一個路由器 (可以給瀏覽器或是其他連結此網路資源的介面使用) : route 路由器告訴 Web API 如何導引 HTTP 請求 (request) 到各自的 Endpoint。若是要在 OData v4.0 下創立一個路由,可以呼叫 config.Routes.MapODataRoute 延伸方法來達成。
      此外,若是一個 Web API 有多個 OData endpoint,則可以透過給不同的路由器名稱 (routeName) 及路徑前綴 (routePrefix) 來設定路由器以便對應不同的 API。

  • 路由器定義

    • builder.EntitySet 中使用的類別定義需與 Models 定義之類別名稱相同,而控制器名稱需與控制器前綴名稱 ([控制器名稱]Controller.cs) 相同

      builder.EntitySet<資料表類別,本例為 ODATA>("控制器名稱,本例為 OData1")
      
    • routePrefix 則是定義 CRUD 導入的網址路由路徑,本例而言即為

      http://localhost:port/ODataPrefix/{controller name}/{OData operations}
      

加入一個 OData 控制器 (Controller)


微軟官網上說明「A controller is a class that handles HTTP requests.」,Controller 便是一個資料處理者。一個 OData 服務可以透過不同的 Controller 來處理不同的 Data Entity Set。
本次的範例中,可以創造一個 Controller 來處理 Product entity set。

  • 建議於加入 controller 時,先 rebuild 專案以取得先前 Model 的設置,則可以點擊 「建置」 > 「重建方案」來達成。

  • 右鍵點擊 Controllers 資料夾 > 加入 > 控制器 > Web API 2 OData v3 Controller with action, using Entity Framework 因本次範例使用 Entity Framework,且目前最新 OData v3 使用 Add Controller scaffolding (尚無 scaffolding for OData v4)。但這會與 OData v4 版本衝突,需要調整路由器的註冊選單 (App_Start/WebApiConfig.cs)。

  • 模型類別 > 選擇剛已建置的資料模型「Product (WebAPIOData.Models)」,其中 WebAPIOData 為本專案名稱 > 資料內容類別 > 選擇剛已建立的類別「ProductsContext (WebAPIOData.Models)」

  • 勾選使用非同步控制器動作 (不需每次運作都要去重取完整 Data Model,尤其背後若有大型資料庫更是如此) > 控制器名稱 > 建議使用預設 (否則需符合 [自命名]Controller 的格式)

  • 控制器的命名需和路由器註冊的設定名稱相同

    builder.EntitySet<ODATA>("OData1");
    

  • 若是 Visual Studio 提示錯誤,需要 rebuild 專案,則可以點擊 「建置」 > 「重建方案」,讓開發環境重新取得先前 Model 的設置。

  • 將下列程式模板加入此 OData1Controller.cs 中

using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.SqlClient;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.Http.OData;
using System.Web.Http.OData.Routing;
using webAPIODataModel.Models;

namespace webAPIODataModel.Controllers
{
    /*
    WebApiConfig 類別可能需要其他變更以新增此控制器的路由,請將這些陳述式合併到 WebApiConfig 類別的 Register 方法。注意 OData URL 有區分大小寫。
    預設即有部分程式碼供導引如下;
    using System.Web.Http.OData.Builder;
    using System.Web.Http.OData.Extensions;
    using webAPIODataModel.Models;
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<ODATA>("ODATAs");
    config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
    */
    public class OData1Controller : System.Web.Http.OData.ODataController
    {
        private ODATACONTENT db = new ODATACONTENT();

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool ODATAExists(int key)
        {
            return db.OData.Count(e => e.id == key) > 0;
        }
    }
}

此控制器 OData1Controller 使用 ODATACONTENT 類別來存取使用 EF 框架的資料庫。注意此控制器 overrides 其中的 Dispose method 來處理 ODATACONTENT。
而這是此控制器的起始點,下一步便會增加 CRUD 的操作模式。

查詢 Entity Set (Querying the Entity Set)


  • 加入下方的類別方法入 OData1Controller (OData1Controller.cs) 中
[EnableQuery]
public IQueryable<ODATA> Get()
{
    return db.OData;
}

[EnableQuery]
public SingleResult<ODATA> Get([FromODataUri] int key)
{
    return SingleResult.Create(db.OData.Where(oDATA => oDATA.id == key));
}
  • 沒有參數版本的 Get Method 回傳完整的 Products 物件集合。
    而含有一個 key 參數的 Get Method 則透過此 Key 查詢 Product 物件,此例子是利用 Id 特性 (property)。
  • 屬性 [EnableQuery] 允許 CLients 來修正搜尋,透過搜尋選項如 $filter, $sort, 及 $page 等。若要搜尋更多的資訊,可以參考 Supporting OData Query Options

加入一項資料體入資料體 (Adding an Entity to the Entity Set)


  • 若要能允許使用者將一個新物件 Product 加入資料庫中,可以加入底下方法入 OData1Controller (OData1Controller.cs) 中

    // POST: odata/ODATAs
    public async Task<IHttpActionResult> Post(ODATA oDATA)
    {
      if (!ModelState.IsValid)
      {
          return BadRequest(ModelState);
      }
    
      db.OData.Add(oDATA);
      await db.SaveChangesAsync();
    
      return Created(oDATA);
    }
    

更新資料體 (Updating an Entity)


  • OData 支援兩種不同的語法來更新資料體,即 PATCH 與 PUT。

    • PATCH 執行 partial update,使用者透過標示特性的方式來針對資料進行更新。(The client specifies just the properties to update.)

    • PUT 則是更新整個資料體。PUT 缺點為使用者必須傳送資料體中所有的特性,包含沒有要更新的值。因此 OData 規則中比較建議使用 PATCH。

  • 底下為 async 的 PATCH 實作方式

    // PATCH: odata/ODATAs(5)
    [AcceptVerbs("PATCH", "MERGE")]
    public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<ODATA> patch)
    {
      Validate(patch.GetEntity());
    
      if (!ModelState.IsValid)
      {
          return BadRequest(ModelState);
      }
    
      ODATA oDATA = await db.OData.FindAsync(key);
      if (oDATA == null)
      {
          return NotFound();
      }
    
      patch.Patch(oDATA);
    
      try
      {
          await db.SaveChangesAsync();
      }
      catch (DbUpdateConcurrencyException)
      {
          if (!ODATAExists(key))
          {
              return NotFound();
          }
          else
          {
              throw;
          }
      }
    
      return Updated(oDATA);
    }
    
  • 底下為 async 的 PUT 實作方法

    public async Task<IHttpActionResult> Put([FromODataUri] int key, Delta<ODATA> patch)
    {
      Validate(patch.GetEntity());
    
      if (!ModelState.IsValid)
      {
          return BadRequest(ModelState);
      }
    
      ODATA oDATA = await db.OData.FindAsync(key);
      if (oDATA == null)
      {
          return NotFound();
      }
    
      patch.Put(oDATA);
    
      try
      {
          await db.SaveChangesAsync();
      }
      catch (DbUpdateConcurrencyException)
      {
          if (!ODATAExists(key))
          {
              return NotFound();
          }
          else
          {
              throw;
          }
      }
    
      return Updated(oDATA);
    }
    

    在 PATCH 方法中,控制器使用 Delta 方法來追蹤改變的值。

刪除一個資料 (Deleting an Entity)


  • 若要使用者能夠從資料庫中刪除一筆資料 (delete a product from the database),可以加入底下方法入 ProductsController (ProductsController.cs) 中

    // DELETE: odata/ODATAs(5), use the id as key (identifier)
    public async Task<IHttpActionResult> Delete([FromODataUri] int key)
    {
      ODATA oDATA = await db.OData.FindAsync(key);
      if (oDATA == null)
      {
          return NotFound();
      }
    
      db.OData.Remove(oDATA);
      await db.SaveChangesAsync();
    
      return StatusCode(HttpStatusCode.NoContent);
    }
    

佈署至 IIS Server (7.5 為例)


  • 以發行方式進行將 Web API 匯出
    • 「方案總管」 > 對專案點右鍵 (WebAPIODataModel) > 發行

  • 設定檔 「自訂」 > 輸入一個設定檔名稱 > "下一步" > iis 的發行方法 > 「檔案系統」 > 目標位置 「(選擇要放置的路徑,此路徑之後會給 IIS 建立網站使用,舉放置在桌面的 webAPIODataModelIIS 資料夾為例)」> "下一步"

  • 設定 > 組態「Release」> "下一步" > "發行"

  • 因為 Web API 發行檔多為開放於網路空間,但發行後的 Web API 內容預設並非給公開使用,因此需先增加一個使用權限,便能透過 IIS 進行架設。對剛發行完版本的資料夾點擊右鍵 > 「內容」 > 「安全性」 > 「編輯」 > 「新增」 > 輸入物件名稱來選取 「Users」 > 「確定」 > SYSTEM 的權限 (此部分需視此 API 的用途,是否具被寫入等功能) 來決定 > 「確定」 > 即可。

  • 開啟 IIS
註解
需要注意 IIS 需要先開啟 ASP, ASP.NET 功能。若沒有開啟,可以從控制台 > 開啟或關閉 Windows 功能 > Internet Information Services > World Wide Web 服務 > 應用程式開發功能,點擊 .NET 擴充性, ASP, ASP.NET,然後點選確定來開啟。
  • 右鍵點擊「站台」 > 「新增網站」 > 寫入「站台名稱」 > 指定「實體路徑」 > 繫結 > 連接埠 「8100」 (此可以自行調整)

  • 因為此資料夾在網路上為一階層,因此需要開啟「瀏覽目錄」的功能,在點擊此新網站後,選擇 IIS > 雙點擊「瀏覽目錄」 > 於右側的「動作」中 > 「開啟」即可。

  • 最後因為本 Web API 已經使用 .NET Framework 4.0 版本,故於「應用程式集區」下,選擇 「webAPIODataModelIIS」,並在 .NET Framework 版本選擇「.NET Framework v4.0.30319」。

使用方式

假設以 192.681.1.24 作 IP address 為例

  • 來自 HTTP 的 Request

    • OData Web API

      http://localhost:1495/ODataPrefix/    <!--測試機-->
      http://192.168.1.24:8100/ODataPrefix/    <!--IIS 下-->
      
    • 取得 metadata

      http://localhost:1495/ODataPrefix/$metadata    <!--測試機-->
      http://192.168.1.24:8100/ODataPrefix/$metadata    <!--IIS 下-->
      
    • 取出前 3 例

      http://localhost:1495/ODataPrefix/OData1(3)    <!--測試機-->
      http://localhost:1495/ODataPrefix/OData1/?$top=3    <!--測試機-->
      http://192.168.1.24:8100/ODataPrefix/OData1(3)    <!--IIS 下-->
      http://192.168.1.24:8100/ODataPrefix/OData1/?$top=3    <!--IIS 下-->
      
    • 取出 name 為 f 的該筆資料

      http://localhost:1495/ODataPrefix/OData1/?$filter=name eq 'f'    <!--測試機-->
      http://192.168.1.24:8100/ODataPrefix/OData1/?$filter=name eq 'f'    <!--IIS 下-->
      
  • Client 透過 ajax 方式進行 CRUD 操作

    • OData 於 RESTful 的內容:
{
 "odata.metadata":"http://192.168.2.8:8100/ODataPrefix/$metadata#OData1","value":[
    {
      "id":1,"name":"a"
    },{
      "id":2,"name":"update2"
    },{
      "id":3,"name":"c"
    },{
      "id":6,"name":"new5"
    }
  ]
}
  • 'GET' or 'Read' : 當使用者按下按鈕後,取得 DB 中第一筆資料中 name 屬性的值。
    • html 及 Javascript code :
<button id="get">Send an HTTP GET request to fetch the name(attribute) of the first data(entity) from DB.</button>
// function get
$("#get").click(function () {
    $.ajax({
        url: 'ODataPrefix/OData1',
        type: 'GET',
        dataType: 'json',
        success: function (data) {
            alert(data["value"][0]["name"]);
        }
    });
});
  • 'POST' or 'Create' : 創造一筆資料入資料庫中,需要注意資料庫綱目設定中需有 id (identifier),且此 id 不能由使用者加入,需為 auto increment
    • html 及 Javascript code :
<button id="post">Send an HTTP POST (create) request to add a piece of data into the DB.</button>
// function post, add values without id
var postObj = { "name" : 'new5' };
$("#post").click(function () {
    $.ajax({
        url: 'ODataPrefix/OData1',
        type: 'POST',
        data: JSON.stringify(postObj),
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            alert("POST OK");
        }
    });
});
  • 'PATCH' or 'Update' : 更新 DB 中某一筆資料,此例用 PATCH 作為範例。需要注意 PATCH Url 需有指定 ID
    • html 及 Javascript code :
<button id="patch">Send an HTTP PATCH (partially update) request to partially update DB.</button>
// function patch
var patchObj = { "name" : "update2" };
$("#patch").click(function () {
    $.ajax({
        // 必須指定要更新哪一筆資料,透過指定 id 的方式進行
        url: 'ODataPrefix/OData1(2)',
        type: 'PATCH',
        data: JSON.stringify(patchObj),
        dataType: 'json',
        contentType: 'application/json',
        success: function (data) {
            alert("PATCH OK");
        }
    });
});
  • 'DELETE' or 'Delete' : 從 DB 中刪除一筆資料。和 PATCH 操作相同,需要指定 ID。
    • html 及 Javascript code :
<button id="delete">Send an DELETE POST request to delete a piece of data from the DB.</button>
// function delete
$("#delete").click(function () {
   $.ajax({
        // 必須指定要刪除哪一筆資料,透過指定 id 的方式進行
        url: "ODataPrefix/OData1(5)",
        type: 'DELETE',
        success: function (data) {
            alert("DELETE OK");
        }
   });
});

results matching ""

    No results matching ""