Delphi開發者可藉由AWS SDK for Delphi輕鬆整合Amazon S3等雲端服務,並結合WebBroker框架構建高效能的RESTful API後端服務。本文將逐步引導讀者完成AWS SDK的設定、S3客戶端應用程式的建立,以及WebBroker伺服器的組態和RESTful API的設計與實作。透過整合這些技術,開發者可以建立具備高擴充套件性和安全性的多層架構應用程式,滿足現代Web應用程式的需求。文章中將提供程式碼範例和圖表說明,幫助讀者更清晰地理解實作過程和技術架構。此外,文章也探討瞭如何使用DataSnap和RAD Server等技術,為Delphi應用程式建構更強大的後端服務,以應對日益增長的業務需求和複雜的應用場景。

使用AWS SDK for Delphi整合Web服務

本章節將探討如何使用AWS SDK for Delphi來與Amazon S3雲端儲存服務進行整合。AWS SDK for Delphi是一個強大的工具,能夠讓開發者輕鬆地在Delphi應用程式中使用AWS的各種服務。

設定AWS SDK for Delphi

在使用AWS SDK for Delphi之前,您需要進行一些設定。首先,您需要在AWS上建立一個帳戶並取得存取金鑰(Access Key)和秘密存取金鑰(Secret Access Key)。然後,您需要在本機電腦上設定AWS SDK的組態。

設定步驟:

  1. 在您的主資料夾下的.aws資料夾中建立一個credentials檔案。
  2. credentials檔案中新增以下內容:
    [default]
    aws_access_key_id=您的存取金鑰
    aws_secret_access_key=您的秘密存取金鑰
    

建立S3客戶端應用程式

步驟1:建立新的Delphi多裝置應用程式

建立一個新的Delphi多裝置應用程式,並將主表單單元儲存為S3SDKClient_MainForm,將專案儲存為S3SDKClient

步驟2:設計使用者介面

  1. 在表單上新增一個TToolbar控制項,並將其對齊到頂部。
  2. 在工具列上新增一個TEdit控制項和一個TButton控制項,分別命名為EdBucketNameBtnList
  3. 在表單的客戶區域新增一個TListBox控制項和一個TImage控制項,分別對齊到左側和客戶區域。

步驟3:初始化S3客戶端

  1. 在表單單元的介面部分新增AWS.S3單元。
  2. 在表單類別的私有區段宣告兩個變數:FS3Client: IS3Client;LResponse: IS3ListObjectsV2Response;
  3. 在表單的OnCreate事件處理常式中初始化S3客戶端:
    procedure TFormS3.FormCreate(Sender: TObject);
    begin
      var LOptions := TS3Options.Create;
      LOptions.Region := 'us-east-1';
      FS3Client := TS3Client.Create(LOptions);
    end;
    

步驟4:列出儲存桶中的物件

  1. BtnList的點選事件處理常式中,根據EdBucketName中的儲存桶名稱列出儲存桶中的物件:
    procedure TFormS3.BtnListClick(Sender: TObject);
    var
      LRequest: IS3ListObjectsV2Request;
    begin
      LRequest := TS3ListObjectsV2Request.Create(EdBucketName.Text);
      LResponse := FS3Client.ListObjectsV2(LRequest);
      if LResponse.IsSuccessful then
        for var Item in LResponse.Contents do
          ListBox1.Items.Add(Item.Key + ' (' + Item.ContentType + ')');
    end;
    

步驟5:下載並顯示選定的物件

  1. ListBox1的雙擊事件處理常式中,下載選定的物件並在Image1中顯示:
    procedure TFormS3.ListBox1DblClick(Sender: TObject);
    begin
      var Item := LResponse.Contents[ListBox1.ItemIndex];
      Item.DownloadFile(Item.Key);
      Image1.Bitmap.LoadFromFile(Item.Key);
    end;
    
程式碼重點:
  • 使用 TS3ClientIS3ListObjectsV2Request 來與 S3 服務互動。
  • 使用 ListObjectsV2 方法來列出儲存桶中的物件。
  • 使用 DownloadFile 方法來下載選定的物件。

圖表說明:

此圖示展示了S3客戶端應用程式的使用者介面。

圖表翻譯: 此圖示描述了S3客戶端應用程式的操作流程。使用者首先輸入儲存桶名稱,然後應用程式列出儲存桶中的物件。使用者可以選擇下載特定的物件,並在應用程式中顯示其內容。

在未來的章節中,我們將繼續探討如何使用Delphi來建立更複雜的Web服務和後端應用程式。包括使用DataSnap和RAD Server等技術來建立可擴充套件和安全的後端服務。這些技術將能夠幫助開發者建立更強大和靈活的應用程式,以滿足不斷變化的業務需求。

建構行動後端服務

在多層架構(Multi-tier Architectures)中,客戶端應用程式與伺服器應用程式之間的通訊是為了存取底層資源。相較於客戶端/伺服器應用程式,多層架構將使用者介面(UI)、商業邏輯和資料庫存取分離,使得客戶端應用程式僅包含UI和有限的商業邏輯,從而提升了可擴充套件性和安全性。

多層架構的優點

多層架構雖然增加了應用程式架構的複雜度,但帶來了許多好處,例如:

  • 提升可擴充套件性
  • 增強安全性
  • 能夠使用單一分享後端建立多個客戶端(例如行動、桌面和網頁客戶端)
  • 簡化變更管理,因為客戶端應用程式與底層服務之間透過伺服器API提供的抽象層進行通訊

在多層架構中,實際的伺服器應用程式只是整體架構的一部分。伺服器應用程式的佈署方式非常重要。如果可擴充套件性和服務的高用性是首要考慮因素,那麼應該考慮使用負載平衡技術。根據傳入的HTTP請求數量,自動擴充套件基礎設施可以啟動和停止虛擬機器映像的例項,以適應當前的負載。

使用WebBroker建立Web服務

Delphi提供了一個基礎函式庫,稱為WebBroker,用於建立Web服務。WebBroker是最簡單和最通用的Web伺服器開發框架,它是許多專門Web服務型別的基礎技術,例如SOAP XML Web服務、DataSnap和RAD Server。

建立第一個WebBroker伺服器應用程式

以下是建立第一個WebBroker伺服器應用程式的步驟:

  1. 在IDE中點選檔案 | 新增 | 其他,然後在網頁類別中雙擊Web伺服器應用程式精靈。
  2. 在精靈的第一頁,標題為平台,您可以選擇目標平台。Windows是必需的,您也可以新增Linux(如果您的Delphi版本支援)。
  3. 在精靈的第二頁,標題為WebBroker專案型別,您需要決定專案如何與Web伺服器整合。WebBroker提供了四個選項:
    • Apache動態連結模組:用於與Windows或Linux上的Apache網頁伺服器整合。
    • 獨立主控台應用程式:根據Indy網頁伺服器技術的自包含可執行檔,無GUI(更適合Linux目標)。
    • 獨立GUI應用程式:也是根據Indy網頁伺服器技術的自包含可執行檔,但具有主表單(便於在Windows上除錯)。
    • ISAPI動態連結函式庫(DLL):用於與Windows上的Microsoft IIS整合(如果在第一頁選擇Linux,則此選項不可用)。

產生獨立專案

讓我們產生一個根據主控台的WebBroker伺服器:

  1. 選擇獨立主控台應用程式選項。
  2. 如果選擇獨立選項,在精靈的最後一頁,標題為埠號,您可以選擇通訊協定(HTTP或HTTPS)和要使用的埠號(預設為8080)。還有一個按鈕可以測試所選埠是否當前可用。
  3. 點選測試埠按鈕以驗證所選埠未被使用,然後點選完成以產生WebBroker伺服器專案。

使用Plantuml圖表說明多層架構

圖表翻譯: 此圖示呈現了客戶端應用程式與伺服器應用程式之間的通訊流程。客戶端傳送HTTP請求到伺服器,伺服器存取資料函式庫後傳回結果給客戶端。

程式碼範例

以下是一個簡單的WebBroker伺服器範例:

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content := '<html><body>Hello, World!</body></html>';
end;

內容解密:

此段程式碼定義了WebBroker伺服器的預設處理程式。當收到HTTP請求時,伺服器傳回一個簡單的HTML頁面,內容為"Hello, World!"。

  • TWebModule1 是Web模組的類別名稱。
  • WebModule1DefaultHandlerAction 是處理HTTP請求的事件處理程式。
  • Response.Content 用於設定HTTP回應的內容。

使用WebBroker進行低階開發

獨立WebBroker伺服器

首先,我們使用Delphi的WebBroker技術建立一個簡單的伺服器。預設情況下,由精靈產生的伺服器組態為使用8080埠進行HTTP通訊。由於只有一個伺服器可以監聽8080埠,因此可能需要將此埠更改為8081或其他值,並相應地更新客戶端的呼叫。如果在同一埠上執行第二個伺服器,將會在伺服器開啟埠時收到錯誤訊息,提示該埠已被同一台電腦上的另一個伺服器佔用。

建立專案結構

  1. 為專案建立一個新的資料夾,並在其中建立三個子目錄:apachestandaloneshared
  2. 在Delphi中點選「儲存全部」按鈕,將ServerConst1單元儲存到standalone資料夾,將WebModuleUnit1儲存到shared資料夾,並將專案儲存為ToDoWebBrokerStandaloneHTTP,確保它也儲存在standalone資料夾中。
  3. 在Windows上執行Web伺服器專案。應該會看到控制檯視窗提示輸入選項,輸入start以啟動Web伺服器。如果出現Windows防火牆的訊息,請點選「允許」或「允許存取」按鈕,以允許客戶端應用程式與伺服器通訊。
  4. 開啟網頁瀏覽器並輸入localhost:8080127.0.0.1:8080,應該會看到伺服器的預設網頁。如果更改了伺服器的埠,需要相應地調整URL。
  5. 可以在Web伺服器控制檯輸入exit以停止Web伺服器專案。

程式碼修改

為了避免每次啟動伺服器時都需要手動輸入start,可以對主程式檔案進行小幅修改:

procedure RunServer(LServer: TIdHTTPWebBrokerServer);
begin
  // ...
  LServer.DefaultPort := 8080;
  StartServer(LServer); // 將此行移到while True do之前
  while True do
    // ...
end;

這樣,伺服器就會自動啟動。

WebBroker應用程式結構

WebBroker應用程式的主要結構是根據一系列動作(actions),這些動作對應於Web伺服器應用程式中的不同URL路徑。這些動作儲存在Web模組的Actions集合屬性中。

Web模組和動作

精靈已經產生了一個具有預設屬性的動作,當HTTP請求到達伺服器時,該動作會被呼叫。在該動作的OnAction事件中,可以輸入在HTTP請求到達時執行的程式碼。

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content := 
    '<html>' +
    '<head><title>To-Do REST API</title></head>' +
    '<body>Delphi "To-Do List" REST API</body>' +
    '</html>';
end;

內容解密:

此段程式碼的作用是當接收到HTTP請求時,傳回一個簡單的HTML頁面,顯示「Delphi “To-Do List” REST API」。其中:

  • TWebModule1.WebModule1DefaultHandlerAction是處理預設HTTP請求的事件處理程式。
  • Response.Content屬性用於設定要傳回給客戶端的HTTP回應內容。
  • 程式碼中使用字串拼接的方式構建了一個簡單的HTML頁面。

新增Apache支援

為了支援Apache,我們需要新增第二個專案:

  1. 在專案管理器中右鍵點選專案群組節點,選擇「新增專案」。
  2. 再次雙擊「新的Web伺服器應用程式」圖示。
  3. 在精靈的第一頁,選擇新增Linux支援。
  4. 在第二頁,選擇「Apache動態連結模組」作為專案型別。
  5. 在最後一頁,可以指定要支援的Apache版本,通常保留預設值即可。
  6. 點選「完成」按鈕,Apache專案就被產生了。
  7. 小心儲存專案,將Web模組單元儲存為WebModuleUnit2apache資料夾中,將專案儲存為ToDoWebBrokerApache在同一個資料夾中,並將專案群組儲存為ToDoWebBrokerGrp

共用Web模組

為了讓兩個專案共用同一個Web模組,需要進行以下步驟:

  1. 在專案管理器中,將WebModuleUnit1拖曳到Apache專案節點上。
  2. 在確認對話方塊中確認新增該單元到專案中。
  3. 右鍵點選WebModuleUnit2並選擇「從專案中移除」。

這樣,兩個專案就共用了同一個Web模組程式碼。右鍵點選專案群組節點並選擇「全部編譯」,就可以同時為測試編譯獨立應用程式,以及為佈署編譯Apache模組。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam sequenceArrowThickness 2

title Delphi整合AWS S3與WebBroker建構REST服務

actor "客戶端" as client
participant "API Gateway" as gateway
participant "認證服務" as auth
participant "業務服務" as service
database "資料庫" as db
queue "訊息佇列" as mq

client -> gateway : HTTP 請求
gateway -> auth : 驗證 Token
auth --> gateway : 認證結果

alt 認證成功
    gateway -> service : 轉發請求
    service -> db : 查詢/更新資料
    db --> service : 回傳結果
    service -> mq : 發送事件
    service --> gateway : 回應資料
    gateway --> client : HTTP 200 OK
else 認證失敗
    gateway --> client : HTTP 401 Unauthorized
end

@enduml

圖表翻譯:

此圖表呈現了使用WebBroker技術建立伺服器並新增Apache支援的流程。首先,建立專案結構並建立獨立的WebBroker伺服器。接著,修改主程式檔案以實作伺服器的自動啟動。然後,瞭解WebBroker應用程式的結構,並新增對Apache的支援。最後,共用Web模組以便在不同環境下佈署。

使用WebBroker建立RESTful服務

在前面的章節中,我們已經探討瞭如何使用WebBroker建立一個基本的Web伺服器。在本文中,我們將深入瞭解如何利用WebBroker建立一個提供RESTful API的服務。

建立Apache模組與客戶端應用程式

首先,我們需要建立一個Apache模組和一個客戶端應用程式。為此,我們需要在專案群組中新增一個新的資料夾,並將ToDoListSQLite專案中的檔案複製到該資料夾中。然後,將ToDoListSQLite專案新增到專案群組中,並將其儲存為ToDoListRESTClient。

設定客戶端應用程式

  1. uToDoTypesuToDoUtilsuDMToDo單元移動到共用資料夾中,並將它們新增到伺服器專案中。
  2. uToDoTypesuToDoUtils單元新增到客戶端專案中。
  3. 編譯所有三個專案,以確保它們都能成功編譯。

建立Web模組

接下來,我們需要在Web模組中新增五個新的Web動作專案,以對應底層的CRUDL操作。這些操作將透過不同的URL公開。

設定Web動作專案

  1. 在Web模組中新增五個新的Web動作專案,分別命名為ActToDoCreateActToDoReadActToDoUpdateActToDoDeleteActToDoList
  2. 在每個動作的PathInfo屬性中,分別輸入/ToDo/Create/ToDo/Read/ToDo/Update/ToDo/Delete/ToDo/List

實作OnAction事件處理常式

為了實作OnAction事件處理常式,我們需要提供對底層IToDoData介面的存取。為此,我們需要在資料模組的介面區段中新增uToDoTypes單元,並在實作區段中新增uDMToDouToDoUtils單元。

宣告私有欄位和函式

private
  FToDoData: IToDoData;
  function GetToDoData: IToDoData;

實作GetToDoData函式

function TWebModule1.GetToDoData: IToDoData;
begin
  if FToDoData = nil then
    FToDoData := TDMToDoS3.Create(nil);
  Result := FToDoData;
end;

建立新的ToDo專案

現在,我們可以實作ActToDoCreate動作的OnAction事件處理常式,以新增新的ToDo專案。

實作ActToDoCreate動作

procedure TWebModule1.WebModule1ActToDoCreateAction(
  Sender: TObject; Request: TWebRequest;
  Response: TWebResponse; var Handled: Boolean);
var
  AToDo: TToDo;
begin
  AToDo.Title := Request.QueryFields.Values['title'];
  AToDo.Category := Request.QueryFields.Values['category'];
  var Id := GetToDoData.ToDoCreate(AToDo);
  Response.Content := Id.ToString;
end;

讀取資料和其他操作

同樣地,我們可以實作其他動作的OnAction事件處理常式,以讀取資料、更新資料、刪除資料和列出資料。

實作ActToDoRead動作

procedure TWebModule1.WebModule1ActToDoReadAction(
  Sender: TObject; Request: TWebRequest;
  Response: TWebResponse; var Handled: Boolean);
var
  AToDo: TToDo;
begin
  var Id := Request.QueryFields.Values['id'].ToInteger;
  if GetToDoData.ToDoRead(Id, AToDo) then
    Response.Content := ToDoToStr(AToDo)
  else
    Response.Content := 'Failed';
  Response.ContentType := 'application/json';
end;

ToDoToStr函式

function ToDoToStr(AToDo: TToDo): string;
var
  ASw: TStringWriter;
  AJtw: TJsonTextWriter;
begin
  ASw := TStringWriter.Create;
  AJtw := TJsonTextWriter.Create(ASw);
  try
    AJtw.WriteStartObject;
    // ...

圖表翻譯:

此圖示展示了 Web Module 中 Actions 的結構與組態。 圖表翻譯: 圖中呈現了 Web Module 的 Actions 組態,包含多個動作專案及其對應的 URL 路徑,用於處理不同的 RESTful 請求。

圖表內容說明

  • 圖表清晰地展示了 Web Module 中各個動作專案的結構與組態。
  • 每個動作專案都對應特定的 URL,用於實作 RESTful API 的不同操作。
  • 圖表幫助開發者理解如何組態和管理 Web Module 中的 Actions,以支援後端服務的運作。