Delphi 提供了穩定的元件與函式庫,方便開發者整合現有的 Web 服務以及新興的雲端服務。透過內建的 WSDL 匯入工具,開發者可以快速連線 SOAP Web 服務,並直接呼叫服務方法。同時,Delphi 的 REST Client Library 簡化了 RESTful API 的整合流程,提供 TRESTClient、TRESTRequest 和 TRESTResponse 等元件,方便開發者建構 HTTP 請求、處理回應以及解析 JSON 或 XML 格式的資料。此外,Delphi 也支援雲端服務的整合,開發者可以利用 Delphi Cloud API 框架連線 Azure 和 AWS 等雲端平台,例如使用 Azure Table 服務儲存資料,或是透過 AWS SDK for Delphi 操作 S3 等服務。這些工具和框架讓 Delphi 開發者能夠輕鬆地將應用程式現代化,並充分利用雲端服務的優勢。
使用Delphi整合Web服務
Delphi提供了強大的工具來整合Web服務,無論是使用SOAP還是REST。本章將探討如何使用Delphi與這兩種Web服務進行整合。
與SOAP Web服務整合
SOAP(簡單物件存取協定)是一種根據XML的協定,用於在網路上交換結構化的資訊。Delphi提供了便捷的方式來與SOAP Web服務進行整合。
匯入WSDL
要與SOAP Web服務進行整合,第一步是匯入Web服務的WSDL(Web服務描述語言)檔案。以下是步驟:
- 在Delphi IDE中,選擇“File” > “New” > “Other…”,然後在“Delphi Projects”下選擇“WSDL Importer”。
- 輸入WSDL檔案的URL或選擇本地檔案。
- 按照向導的指示完成匯入過程。
向導將生成一個新的單元,該單元包含與Web服務互動所需的介面和函式。
使用產生的介面
匯入WSDL後,向導將生成一個介面型別(例如NumberConversionSoapType),該型別封裝了Web服務的功能。您可以使用產生的全域函式(例如GetNumberConversionSoapType)來取得該介面的參考。
type
NumberConversionSoapType = interface(IInvokable)
['{A2E4D9CB-C96F-0965-87F0-E78269B29A8C}']
function NumberToWords(const ubiNum: Int64): string; stdcall;
function NumberToDollars(const dNum: TXSDecimal): string; stdcall;
end;
function GetNumberConversionSoapType(UseWSDL: Boolean = System.False; Addr: string = ''; HTTPRIO: THTTPRIO = nil): NumberConversionSoapType;
呼叫Web服務
要呼叫Web服務,只需使用產生的介面參考即可呼叫所需的方法。
procedure TFormNumbers.BtnConvertClick(Sender: TObject);
begin
var SNumber := GetNumberConversionSoapType.NumberToWords(Trunc(NumberBox1.Value));
Memo1.Text := SNumber;
end;
內容解密:
GetNumberConversionSoapType是一個全域函式,用於取得NumberConversionSoapType介面的參考。NumberToWords是NumberConversionSoapType介面中的一個方法,用於將數字轉換為文字。Trunc(NumberBox1.Value)用於取得輸入數字的整數部分。- 將結果指定給
Memo1.Text以顯示在表單上。
與REST Web服務整合
REST(表述性狀態轉移)是一種架構風格,用於設計網路介面。Delphi提供了REST Client Library來簡化與REST Web服務的整合。
使用REST Debugger
Delphi的REST Debugger工具可用於測試REST API。它允許您輸入URL、端點和引數,並預覽結果。
與WeatherStack服務整合
以下是一個使用WeatherStack服務的範例:
- 在WeatherStack網站上建立一個免費帳戶並取得API金鑰。
- 使用REST Debugger或在Delphi中編寫程式碼來呼叫WeatherStack API。
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title 與WeatherStack服務整合
rectangle "HTTP請求" as node1
rectangle "JSON回應" as node2
node1 --> node2
@enduml圖表翻譯: 此圖示展示了客戶端如何透過HTTP請求呼叫WeatherStack API,並接收JSON格式的回應。
Delphi中的REST客戶端元件
Delphi提供了多個元件來與REST服務進行整合,包括TRESTClient、TRESTRequest和TRESTResponse。
var
RESTClient: TRESTClient;
RESTRequest: TRESTRequest;
RESTResponse: TRESTResponse;
begin
RESTClient := TRESTClient.Create('http://api.weatherstack.com');
RESTRequest := TRESTRequest.Create(nil);
RESTResponse := TRESTResponse.Create(nil);
try
RESTRequest.Client := RESTClient;
RESTRequest.Response := RESTResponse;
RESTRequest.Method := rmGET;
RESTRequest.Resource := 'current';
RESTRequest.Params.AddItem('access_key', '您的API金鑰');
RESTRequest.Params.AddItem('query', '台北');
RESTRequest.Execute;
Memo1.Text := RESTResponse.Content;
finally
RESTClient.Free;
RESTRequest.Free;
RESTResponse.Free;
end;
end;
內容解密:
TRESTClient用於建立與REST服務的連線。TRESTRequest用於定義HTTP請求的方法、資源和引數。TRESTResponse用於儲存HTTP回應的內容。- 將API金鑰和查詢引數加入到
RESTRequest.Params中。 - 執行請求並將回應內容顯示在表單上。
本章介紹瞭如何使用Delphi與SOAP和REST Web服務進行整合。透過使用Delphi提供的工具和元件,您可以輕鬆地在應用程式中呼叫Web服務並處理回應。無論是使用SOAP還是REST,Delphi都提供了強大的支援來簡化開發過程。
使用REST Debugger整合氣象服務
在開發Delphi應用程式時,經常需要與外部服務進行互動,例如氣象服務。本章節將介紹如何使用REST Debugger工具來整合氣象服務,並建立一個簡單的氣象客戶端應用程式。
設定REST Debugger
首先,需要使用REST Debugger工具來設定與氣象服務的連線。REST Debugger是一個Delphi內建工具,可以幫助開發者測試和設定RESTful服務。
- 開啟REST Debugger工具。
- 輸入氣象服務的URL和引數,例如
http://api.weatherstack.com/current,並設定access_key和query引數。 - 預覽回應資料,可以選擇JSON或表格格式。
將REST Debugger設定轉換為Delphi元件
一旦設定完成,可以將REST Debugger的設定轉換為Delphi元件。
- 在REST Debugger中,點選「Copy Components」按鈕。
- 在Delphi中,建立一個新的資料模組(Data Module),並將複製的元件貼上。
- 元件包括
TRESTClient、TRESTRequest和TRESTResponse。
建立氣象客戶端應用程式
接下來,建立一個簡單的氣象客戶端應用程式。
- 建立一個新的Delphi多裝置應用程式(Multi-Device Application)。
- 在主表單(Main Form)上新增一個按鈕(Button)、一個編輯框(Edit Box)和一個標籤(Label)。
- 在資料模組中,新增一個
TFDMemTable元件和一個TRESTResponseDataSetAdapter元件,將回應資料對映到記憶體表格中。 - 在按鈕的
OnClick事件處理函式中,寫入以下程式碼:
procedure TFormWeather.BtnRefreshClick(Sender: TObject);
begin
DMWeather.RESTRequest1.Params[1].Value := EditLocation.Text;
DMWeather.RESTRequest1.Execute();
LabelTemp.Text := DMWeather.FDMemTable1.FieldByName('temperature').AsString;
end;
內容解密:
此段程式碼的作用是當使用者點選按鈕時,設定查詢引數、執行REST請求,並將溫度資料顯示在標籤上。
DMWeather.RESTRequest1.Params[1].Value := EditLocation.Text;:將編輯框中的文字設定為查詢引數的值。DMWeather.RESTRequest1.Execute();:執行REST請求。LabelTemp.Text := DMWeather.FDMemTable1.FieldByName('temperature').AsString;:將溫度資料從記憶體表格中讀取並顯示在標籤上。
執行應用程式
執行應用程式,輸入城市名稱,點選按鈕,即可顯示該城市的目前溫度。
注意事項
- 由於免費的WeatherStack服務只支援HTTP,不支援HTTPS,因此在行動裝置上執行時可能會出現相容性問題。
- 可以在AndroidManifest.xml檔案中新增
android:usesCleartextTraffic="true"屬性來解決此問題。
雲端運算簡介
雲端運算是目前IT產業的一大趨勢,指的是將企業內部的伺服器或應用程式遷移到雲端服務上。雲端服務提供商提供各種服務,例如運算資源、儲存空間和資料函式庫等。企業可以根據需求快速擴充套件或縮減資源,避免了傳統伺服器託管方式的資源浪費。
主要雲端服務提供商
- Amazon Web Services(AWS)
- Google Cloud Platform(GCP)
- Microsoft Azure
這些雲端服務提供商提供了各種服務和工具,可以幫助企業快速開發和佈署應用程式。企業可以根據自己的需求選擇適合的雲端服務提供商和服務模式。
整合雲端服務
在現代軟體開發中,雲端服務已成為不可或缺的一部分。Delphi 開發者可以利用多種方式存取雲端服務,包括使用 REST Client 函式庫、Delphi Cloud API 框架,或是 AWS SDK for Delphi。在本章中,我們將重點介紹 Delphi Cloud API 框架,並示範如何使用 Azure Table 服務來儲存 ToDo List 應用程式的資料。
Delphi Cloud API 框架
Delphi Cloud API 框架提供了一組類別和介面,讓開發者可以輕鬆地存取多種雲端服務,包括 Amazon Web Services(AWS)和 Microsoft Azure。該框架的核心單元是 Data.Cloud.CloudAPI,而針對特定雲端服務的類別和介面則定義在 Data.Cloud.AmazonAPI 和 Data.Cloud.AzureAPI 等單元中。
下表列出了目前 Delphi Cloud API 框架所支援的 AWS 和 Azure 服務:
| Amazon Web Services | Microsoft Azure |
|---|---|
| Simple Storage Service (S3) | Blobs Service |
| Simple Database Service | Table Service |
| Simple Queue Service (SQS) | Queue Service |
將 ToDo List 應用程式遷移到 Azure
在本文中,我們將示範如何使用 Azure Table 服務來儲存 ToDo List 應用程式的資料。Azure Table 服務是一種 NoSQL 資料儲存服務,可以用於在多個裝置和應用程式之間共用資料。
設定 Azure 帳戶和儲存服務
在使用 Azure Table 服務之前,您需要建立一個 Azure 帳戶並設定儲存服務。請依照以下步驟進行:
- 建立一個 Azure 帳戶。
- 在 Azure 入口網站中,導航到「儲存體帳戶」並建立一個新的儲存體帳戶。
- 在儲存體帳戶中,建立一個新的 Table 服務。
修改 ToDo List 應用程式
為了使用 Azure Table 服務,我們需要修改 ToDo List 應用程式的資料存取層。以下是修改步驟:
- 將原有的 ToDo List 應用程式原始碼複製到新的目錄中。
- 將專案另存為 ToDoListAzure。
- 在
DMToDoList單元中,刪除所有 FireDAC 元件並新增一個TAzureConnectionInfo元件。 - 建立一個
azure.ini檔案來儲存 Azure 帳戶的設定資訊。 - 在
DataModuleCreate事件處理函式中,載入azure.ini檔案中的設定資訊並初始化TAzureTableService物件。 - 修改
ToDoList方法以使用TAzureTableService物件來載入資料。
procedure TDMToDo.ToDoList(AList: TToDos);
var
Item: TToDo;
RowsList: TList<TCloudTableRow>;
begin
MaxId := 0;
if AList <> nil then
begin
AList.Clear;
RowsList := TableService.QueryEntities(tablename);
try
for var RowObj in RowsList do
begin
Item.Id := RowObj.GetColumn(XML_ROWKEY).Value.ToInteger;
Item.Title := RowObj.GetColumn('title').Value;
Item.Category := RowObj.GetColumn('category').Value;
AList.Add(Item);
end;
finally
RowsList.Free;
end;
end;
end;
程式碼解析
在上述程式碼中,我們使用 TAzureTableService 物件來查詢 Azure Table 服務中的資料。QueryEntities 方法傳回一個 TList<TCloudTableRow> 物件,其中包含了查詢結果的資料列。我們然後遍歷這個列表,並將每一列的資料轉換成 TToDo 物件。
#### 程式碼解析:
1. 使用 `TAzureTableService` 物件來查詢 Azure Table 服務中的資料。
2. `QueryEntities` 方法傳回一個 `TList<TCloudTableRow>` 物件,其中包含了查詢結果的資料列。
3. 遍歷 `TList<TCloudTableRow>` 物件,並將每一列的資料轉換成 `TToDo` 物件。
4. 將轉換後的 `TToDo` 物件加入到 `AList` 中。
使用雲端服務的整合 - Azure 與 AWS SDK for Delphi
在上一章中,我們探討瞭如何使用 Delphi 開發本地資料函式庫應用程式。本章將進一步介紹如何將此應用程式轉換為雲端基礎的應用程式,分別使用 Microsoft Azure 和 Amazon Web Services (AWS)。
將 ToDoList 應用程式遷移到 Azure
為了將 ToDoList 應用程式遷移到 Azure,我們需要實作以下步驟:
1. 初始化 Azure Table Service
首先,我們需要在 TDMToDo 資料模組中初始化 Azure Table Service。
TableService := TAzureTableService.Create(nil);
TableService.AccountName := 'your_account_name';
TableService.AccountKey := 'your_account_key';
2. 實作 ToDoListRead 方法
此方法負責從 Azure 表格服務中讀取資料。
procedure TDMToDo.ToDoListRead;
var
RowsList: TObjectList<TCloudTableRow>;
Item: TCloudTableRow;
ToDo: TToDo;
begin
RowsList := TableService.QueryEntities(TableName, '', '');
try
MaxId := 0;
for Item in RowsList do
begin
ToDo := TToDo.Create;
ToDo.Id := StrToIntDef(Item.GetColumn(XML_ROWKEY).Value, 0);
ToDo.Title := Item.GetColumn('title').Value;
ToDo.Category := Item.GetColumn('category').Value;
FToDoList.Add(ToDo);
if ToDo.Id > MaxId then
MaxId := ToDo.Id;
end;
finally
RowsList.Free;
end;
end;
#### 內容解密:
TableService.QueryEntities用於查詢 Azure 表格服務中的實體。MaxId用於記錄目前最大的 ID 值。
3. 實作 GetNewId 方法
此方法負責計算新的 ID 值。
function TDMToDo.GetNewId: Integer;
begin
Inc(MaxId);
Result := MaxId;
end;
#### 內容解密:
Inc(MaxId)將MaxId加一,以產生新的 ID 值。
4. 實作 ToDoCreate、ToDoUpdate 和 ToDoDelete 方法
這些方法分別負責建立、更新和刪除 Azure 表格服務中的實體。
function TDMToDo.ToDoCreate(AValue: TToDo): Integer;
var
Id: Integer;
RowObj: TCloudTableRow;
ResponseInfo: TCloudResponseInfo;
begin
Id := GetNewId;
RowObj := TCloudTableRow.Create;
try
RowObj.SetColumn(XML_ROWKEY, Id.ToString);
RowObj.SetColumn(XML_PARTITION, Id.ToString);
RowObj.SetColumn('title', AValue.Title);
RowObj.SetColumn('category', AValue.Category);
TableService.InsertEntity(TableName, RowObj, ResponseInfo);
if ResponseInfo.StatusCode = 200 then
Result := Id
else
Result := -1;
finally
RowObj.Free;
ResponseInfo.Free;
end;
end;
function TDMToDo.ToDoUpdate(AValue: TToDo): Boolean;
var
RowObj: TCloudTableRow;
ResponseInfo: TCloudResponseInfo;
begin
RowObj := TCloudTableRow.Create;
try
RowObj.SetColumn(XML_ROWKEY, AValue.Id.ToString);
RowObj.SetColumn(XML_PARTITION, AValue.Id.ToString);
RowObj.SetColumn('title', AValue.Title);
RowObj.SetColumn('category', AValue.Category);
TableService.UpdateEntity(TableName, RowObj, ResponseInfo);
Result := ResponseInfo.StatusCode = 200;
finally
RowObj.Free;
ResponseInfo.Free;
end;
end;
function TDMToDo.ToDoDelete(Id: Integer): Boolean;
var
RowObj: TCloudTableRow;
ResponseInfo: TCloudResponseInfo;
begin
RowObj := TCloudTableRow.Create;
try
RowObj.SetColumn(XML_ROWKEY, Id.ToString);
RowObj.SetColumn(XML_PARTITION, Id.ToString);
TableService.DeleteEntity(TableName, RowObj, ResponseInfo);
Result := ResponseInfo.StatusCode = 200;
finally
RowObj.Free;
ResponseInfo.Free;
end;
end;
#### 內容解密:
ToDoCreate使用GetNewId方法產生新的 ID 值,並將新的實體插入 Azure 表格服務中。ToDoUpdate更新現有的實體。ToDoDelete刪除指定的實體。
使用 AWS SDK for Delphi
AWS SDK for Delphi 是由 Appercept 公司開發的 Delphi 元件,用於與 Amazon Web Services (AWS) 進行互動。以下是使用 AWS SDK for Delphi 的範例:
建立 S3 使用者端
var
S3Client: IAwsS3Client;
begin
S3Client := TAwsS3Client.Create(AwsConfig);
end;
#### 內容解密:
IAwsS3Client是 AWS SDK for Delphi 中用於與 S3 服務互動的介面。TAwsS3Client是實作IAwsS3Client的類別。
列出 S3 Bucket 中的檔案
procedure ListObjects(S3Client: IAwsS3Client; BucketName: string);
var
ListObjectsRequest: TListObjectsRequest;
ListObjectsResponse: TListObjectsResponse;
begin
ListObjectsRequest := TListObjectsRequest.Create(BucketName);
try
ListObjectsResponse := S3Client.ListObjects(ListObjectsRequest);
for var ObjectSummary in ListObjectsResponse.Contents do
Writeln(ObjectSummary.Key);
finally
ListObjectsRequest.Free;
ListObjectsResponse.Free;
end;
end;
#### 內容解密:
TListObjectsRequest用於建立列出物件的請求。TListObjectsResponse用於接收列出物件的回應。S3Client.ListObjects方法用於列出 S3 Bucket 中的物件。