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的組態。
設定步驟:
- 在您的主資料夾下的
.aws資料夾中建立一個credentials檔案。 - 在
credentials檔案中新增以下內容:[default] aws_access_key_id=您的存取金鑰 aws_secret_access_key=您的秘密存取金鑰
建立S3客戶端應用程式
步驟1:建立新的Delphi多裝置應用程式
建立一個新的Delphi多裝置應用程式,並將主表單單元儲存為S3SDKClient_MainForm,將專案儲存為S3SDKClient。
步驟2:設計使用者介面
- 在表單上新增一個
TToolbar控制項,並將其對齊到頂部。 - 在工具列上新增一個
TEdit控制項和一個TButton控制項,分別命名為EdBucketName和BtnList。 - 在表單的客戶區域新增一個
TListBox控制項和一個TImage控制項,分別對齊到左側和客戶區域。
步驟3:初始化S3客戶端
- 在表單單元的介面部分新增
AWS.S3單元。 - 在表單類別的私有區段宣告兩個變數:
FS3Client: IS3Client;和LResponse: IS3ListObjectsV2Response; - 在表單的
OnCreate事件處理常式中初始化S3客戶端:procedure TFormS3.FormCreate(Sender: TObject); begin var LOptions := TS3Options.Create; LOptions.Region := 'us-east-1'; FS3Client := TS3Client.Create(LOptions); end;
步驟4:列出儲存桶中的物件
- 在
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:下載並顯示選定的物件
- 在
ListBox1的雙擊事件處理常式中,下載選定的物件並在Image1中顯示:procedure TFormS3.ListBox1DblClick(Sender: TObject); begin var Item := LResponse.Contents[ListBox1.ItemIndex]; Item.DownloadFile(Item.Key); Image1.Bitmap.LoadFromFile(Item.Key); end;
程式碼重點:
- 使用
TS3Client和IS3ListObjectsV2Request來與 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伺服器應用程式的步驟:
- 在IDE中點選檔案 | 新增 | 其他,然後在網頁類別中雙擊Web伺服器應用程式精靈。
- 在精靈的第一頁,標題為平台,您可以選擇目標平台。Windows是必需的,您也可以新增Linux(如果您的Delphi版本支援)。
- 在精靈的第二頁,標題為WebBroker專案型別,您需要決定專案如何與Web伺服器整合。WebBroker提供了四個選項:
- Apache動態連結模組:用於與Windows或Linux上的Apache網頁伺服器整合。
- 獨立主控台應用程式:根據Indy網頁伺服器技術的自包含可執行檔,無GUI(更適合Linux目標)。
- 獨立GUI應用程式:也是根據Indy網頁伺服器技術的自包含可執行檔,但具有主表單(便於在Windows上除錯)。
- ISAPI動態連結函式庫(DLL):用於與Windows上的Microsoft IIS整合(如果在第一頁選擇Linux,則此選項不可用)。
產生獨立專案
讓我們產生一個根據主控台的WebBroker伺服器:
- 選擇獨立主控台應用程式選項。
- 如果選擇獨立選項,在精靈的最後一頁,標題為埠號,您可以選擇通訊協定(HTTP或HTTPS)和要使用的埠號(預設為8080)。還有一個按鈕可以測試所選埠是否當前可用。
- 點選測試埠按鈕以驗證所選埠未被使用,然後點選完成以產生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或其他值,並相應地更新客戶端的呼叫。如果在同一埠上執行第二個伺服器,將會在伺服器開啟埠時收到錯誤訊息,提示該埠已被同一台電腦上的另一個伺服器佔用。
建立專案結構
- 為專案建立一個新的資料夾,並在其中建立三個子目錄:
apache、standalone和shared。 - 在Delphi中點選「儲存全部」按鈕,將
ServerConst1單元儲存到standalone資料夾,將WebModuleUnit1儲存到shared資料夾,並將專案儲存為ToDoWebBrokerStandaloneHTTP,確保它也儲存在standalone資料夾中。 - 在Windows上執行Web伺服器專案。應該會看到控制檯視窗提示輸入選項,輸入
start以啟動Web伺服器。如果出現Windows防火牆的訊息,請點選「允許」或「允許存取」按鈕,以允許客戶端應用程式與伺服器通訊。 - 開啟網頁瀏覽器並輸入
localhost:8080或127.0.0.1:8080,應該會看到伺服器的預設網頁。如果更改了伺服器的埠,需要相應地調整URL。 - 可以在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,我們需要新增第二個專案:
- 在專案管理器中右鍵點選專案群組節點,選擇「新增專案」。
- 再次雙擊「新的Web伺服器應用程式」圖示。
- 在精靈的第一頁,選擇新增Linux支援。
- 在第二頁,選擇「Apache動態連結模組」作為專案型別。
- 在最後一頁,可以指定要支援的Apache版本,通常保留預設值即可。
- 點選「完成」按鈕,Apache專案就被產生了。
- 小心儲存專案,將Web模組單元儲存為
WebModuleUnit2在apache資料夾中,將專案儲存為ToDoWebBrokerApache在同一個資料夾中,並將專案群組儲存為ToDoWebBrokerGrp。
共用Web模組
為了讓兩個專案共用同一個Web模組,需要進行以下步驟:
- 在專案管理器中,將
WebModuleUnit1拖曳到Apache專案節點上。 - 在確認對話方塊中確認新增該單元到專案中。
- 右鍵點選
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。
設定客戶端應用程式
- 將
uToDoTypes、uToDoUtils和uDMToDo單元移動到共用資料夾中,並將它們新增到伺服器專案中。 - 將
uToDoTypes和uToDoUtils單元新增到客戶端專案中。 - 編譯所有三個專案,以確保它們都能成功編譯。
建立Web模組
接下來,我們需要在Web模組中新增五個新的Web動作專案,以對應底層的CRUDL操作。這些操作將透過不同的URL公開。
設定Web動作專案
- 在Web模組中新增五個新的Web動作專案,分別命名為
ActToDoCreate、ActToDoRead、ActToDoUpdate、ActToDoDelete和ActToDoList。 - 在每個動作的
PathInfo屬性中,分別輸入/ToDo/Create、/ToDo/Read、/ToDo/Update、/ToDo/Delete和/ToDo/List。
實作OnAction事件處理常式
為了實作OnAction事件處理常式,我們需要提供對底層IToDoData介面的存取。為此,我們需要在資料模組的介面區段中新增uToDoTypes單元,並在實作區段中新增uDMToDo和uToDoUtils單元。
宣告私有欄位和函式
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,以支援後端服務的運作。