顯示具有 DataSnap 標籤的文章。 顯示所有文章
顯示具有 DataSnap 標籤的文章。 顯示所有文章

2023/04/20

【Delphi in Depth DataSnap 網站應用程式全端開發】 2023 年更新



作者:吳祐賓




【DELPHI IN DEPTH DATASNAP 網站應用程式全端開發】2023 年更新:給予你一個豐富的 Web 開發武器庫!

電子書的魅力在於它可以持續更新和維護。為了回饋支持者們,我在 2023 年進行了最後一次補充內容。未來的新增內容將以 DLC 的方式推出新書。讀完本書後,你將具備進入 Web 開發戰場的能力,其中很多內容都是改編自我的現行專案,期待你的發揮!

這本書能幫助讀者解決在 Web 開發過程中遇到的各種問題和痛點,包括如何有效地使用 Delphi 和 DataSnap 進行網站應用程式的全端開發,以及如何掌握 Sencha ExtJS 等流行前端框架,讓你的開發技能更上一層樓。


【DELPHI IN DEPTH DATASNAP 網站應用程式全端開發】2023 年更新主要包括以下幾點:


  1. 修正部分 Bug 和優化文句
  2. 新增 Sencha ExtJS 實作教學章節
  3. 提供 Sencha ExtJS 專案附件檔案

感謝早期支持本書的讀者們!為配合後續英文版上線,我做了以下調整:

  1. 中文版維護期限將持續至 2023/12/31,到期後將不再更新(價格也將保持不變)。
  2. Google Play 販售地區將由全球調整為「臺灣」和「香港」(Pubu 則無調整)。
  3. 此次更新後的售價將調整為新台幣 729 元。

把握機會,為自己的 Web 開發能力加分!立即擁有【DELPHI IN DEPTH DATASNAP 網站應用程式全端開發】2023 年更新版,讓你的技能更上一層樓!


  點這裡看書本詳細介紹



2022/12/28

NestedDataSets in ClientDataSets


Overview

The nested dataset feature of ClientDataSet is used to solve the Master-Details design pattern in which a TDataSet field is inserted into the column list. This feature has always been considered a magical technique.

However, the core of database technology is still SQL, so let's take a look at how Delphi uses SQL to pull data in the nested dataset mode.

Surprisingly, the way to pull data is to fetch all details to the client-side at once when fetching data from the header.

2021/06/18

JSON 和 SQL Server 日期轉換上的時區地雷

前端開發了一段時間,終於也讓我遇到日期時區關卡。(笑)

以下的時區為【+08:00】。

JSON 在日期轉換上嚴守 ISO8601 日期規則,並且一律按世界協調時間 (UTC+0) 傳送,導致伺服器接收到的日期都會是少一天的情形。

伺服器接收 ISO8601 日期

原本伺服器接收到 JSON 後,僅做文字擷取後直接送 SQL Server 資料庫,意外就這樣發生了。

SQL Server 面對 ISO8601 文字格式也僅僅只做「所見即所得」的日期轉換,不會做時區處理。

加上時區文字後:


SQL Server 無法識別時區區塊,導致轉換失敗。這裡值得一提的是在「完成時間」的地方,是完整的 ISO8601 日期格式,看來 SQL Server 已知用火,確實有支援 ISO8601 日期。

既然如此,那就用新日期格式 DateTime2 來試試:


以上可以得知:

  • SQL Server 不會對 ISO8601 日期進行時區轉換,僅做日期格式轉換。
  • DateTime 格式不支援 ISO8601 時區區塊
  • DateTime2 完整支援 ISO8601 日期格式。

資料庫不足的地方只能使用後端程式進行轉換,以 Delphi 為例:

ISO8601 日期文字沒有時區內容時,則 UTC 日期時區偏移 0,本機時區 +08:00。


ISO8601 日期文字有時區內容時,則 UTC 日期時區偏移 -08:00,本機時區時區偏移 0。


 

結論

如果是新專案,日期格式一律存放 UTC+0 日期,後端不需處理,而前端 JavaScript 會自動轉換對應時區,算是對前後端都很友善的選項。

前端是採用沒有自動轉換時區的開發工具,就辛苦一點手動處理。(攤手)

萬一是承接舊專案,或在已有資料庫的情形建構前端網站,那資料庫日期十之八九都可能會是以該時區日期存放,此時就會建議後端傳送或接收都要進行本機時區轉換。


不知不覺就掃掉全球化的地雷,哈!

See also

2021/04/26

Dbexpress (DBX) Factory for SQL SERVER

之前在這篇【那些年 DBeXpress 所教我的事:DBXCommon 單元】文章中提到 DBXCommon 是 Dbexpress (以下簡稱 DBX) 最底層的單元,像是 TDBXCommand 和 TDBXReader 便是 TSQLQuery 等 DBX DataSet 所包裝的內容,同時也是 DataSnap 底層架構,所以掌握 TDBXReader 就可說是掌握 DataSnap 效能這件事一點都不為過。

2021/04/19

Delphi 特規 JSON 和 JavaScript Object (2)

 


前情提要:Delphi 特規 JSON 和 JavaScript Object (1)

已知大匠可以將 Blob 型態轉為 Hex JSON Array,但容量會放大 4 倍是硬傷;而 Memo 型態卻也被視為 Blob 型態,導致傳輸內容更加地龐大,更有堪者,可達放大 6 倍之譜。


追綜原因

Delphi 轉換 JSON 封包主要是利用 TDBXJSONTools.TableToJSON 函式庫內容,它會利用 TDBXReader.ValueType 進行 Delphi Value to JSON Value 轉換:

JsonCell := DBXToJSON(Value.Value[I], Value.ValueType[I].DataType, IsLocalConnection);


而 DBXToJSON 裡對 DataType 解析,節錄如下:

2021/03/23

DataSnap 開發前篇 - 架構選擇

作者:吳祐賓

HTTP persistent connection.svg
helix84 - own work, based on [1], 公有領域, 連結

 


開發多層應用程式時,第一關就是面對【多次連線】和【持續連線】的選擇,雖然網路一面倒向多次連線才是王道,但實際真的適合自己嗎?

What is Encryption in Delphi? (2)


DataSnap Server 有提供 PC1 加密過濾器,一開始什麼都用官方預設值,運作下沒有問題,但就是 Key 值都是固定,就來修改一下吧。

同步修改後運作也是正常,正常的測完後,就要來試試【如果伺服端和客戶端密碼不同時會跳出什麼錯誤】。

結果



居然仍能運作!



這就怪了,為什麼兩邊的 KEY 值不同卻能運作無誤?

在經過測試後,它會經過幾個單元:

  • DBXTransport
  • DBXEncryption

DBXEncryption.TPC1Cypher 類別裡有 Cypher / Decypher 加解密函式,就進行測試,才知道每對封包加密傳遞給對方時,KEY 也會在包在其中一同傳給對方,對方再使用該 KEY 進行封包解密,反之亦然。

簡單的說就是:用 KEY 搭配【相同】演算法解密該封包才能夠正確解密。

 

所以要知道正確的演算法才是關鍵,雖然只要是 Delphi 的應用程式就必定可以解開,但以 Delphi 這麼小眾的情形下也算得上一種良好的加密法則。(笑)

See also

2021/03/02

DataSnap Clinet 建立過濾器後連線出現 "Connection Closed Gracefully" 錯誤

本文為【ebook【Delphi跨平台資料庫程式設計火速上手】電子書出版 (CHT)】的補充教材。

DataSnap 伺服器端可以設定的過濾器(Filter)有:

  • PC1 加密過濾器
  • RSA 加密過濾器
  • ZLIB 壓縮過濾器

伺服器端設定後,客戶端也需要進行相同設定,否則便無法使用。僅設定單一過濾器時,此時客戶端可以正確連線。

2021/01/21

【翻譯】DataSnap.ChatRoom Sample


 

原文網址:DataSnap.ChatRoom Sample
無責任翻譯:大匠之風 Eden Wu

 

DataSnap.ChatRoom Sample

展示如何以 DataSnap 建立簡單的【聊天室應用程式】。聊天室是利用 HTTP 技術進行公共和私人對話。

專案位置

你能夠在以下位置找到【聊天室】範例專案:

文章目錄

專案描述

聊天室應用程式會使用到:

  • 建立聊天室伺服器,其中管理員能夠控制使用者行為和發送公共訊息(廣播)。
  • 提供簡單方式使用 HTTP 網路介面,其中使用者能互相發訊息或交換公共訊息(廣播)。

如何使用範例

  1. 引導步驟為 Start | Programs | Embarcadero RAD Studio XE6 | Samples, 底下的 Object Pascal\DataSnap\ChatRoomDemo,然後開啟 ChatRoomServerProject.dproj.
  2. 編譯 ChatRoomServerProject.dproj.
  3. 在 IDE 中選擇 Run > Run 選項或按下 F9 來執行應用程式。
  4. 瀏覽到聊天室應用程式的機器,例如以下網址:http://mymachine.mydomain.net:8087/ChatRoom.htmlhttp://localhost:8087/ChatRoom.html
  5. 提供使用者名稱然後開始進行網路聊天。
  6. 管理員可以在聊天室伺服器應用程式踼除使用者或發送公共訊息。

Files 檔案群

檔案 內容

ChatRoomServerContainer

伺服器容器,搭載 DataSnap Server 元件。

ChatRoomServerMethodsUnit

伺服器函式容器,搭載聊天室範例中所使用到的伺服器函式。

ChatRoomServerProject

專案本身。

ChatRoomServerUnit

構成聊天室範例應用程式的使用者介面主表單。

Classes 類別

  • TUserNotifyThread implements a thread for broadcasting a message to all users, notifying them that a user has logged in or out.
  • TBootUserThread boots the user with the given name.
  • TChatRoomUser represents a single logged in user of the chat room. The ID of the user's session is held here, as logging in and out of the chat room is done by activing sessions with the server.
  • TChatRoomUsers is a singleton class for managing a list of logged in users.
  • TChatRoomServerMethods is declared inside the ChatRoomServerMethodsUnit.pas file and implements the server methods for the Chat Room application.

Procedural Types

  • TUIHookCallback is a no-argument procedure that will tell the user interface to update its user list.

Implementation

  • A TSQLConnection object provides the proxy DataSnap HTTP connection.
  • The Generate JS Proxy button generates the JavaScript proxy information though a TDSJavaScriptProxyWriter.
  • The main user interface contains a list of users and an edit box in which you can type in a message to broadcast to all users. The message you type in is wrapped into a JSON object. The list of users has a pop-up menu associated. This menu contains only one menu item used to throw the user out the chat.
  • The SendMessage and SendMessageToUser functions are used to send a message to all logged in users or to a single user.
  • The ChatRoomServerContainer.dfm form contains a chat room server (TDSServer component), a chat room transport (TDSTCPServerTransport component), a chat room HTTP service (TDSHTTPService component), a chat room authentication manager (TDSAuthenticationManager component), a chat room server class (TDSServerClass component), and a chat room file dispatcher (TDSHTTPServiceFileDispatcher component).

Uses

See Also

 

2020/10/15

Delphi 10.4.1 對 DataSnap 相關修正一覽


Delphi 10.4.1 人品大爆發,大幅修正許多陳年臭蟲,讓人驚豔!以下是從官方網上文件節錄我覺得很有意思的修正項目。

2020/09/16

Delphi JSON Objects framework 處理效率

 


最近在李維老師的部落格看到關於 JSON 的新文章【RAD Studio的JSON處理效率】,主要在描述 TJSONReader 和 TJSONWriter 物件經過重新設計後所推出的 10.4.1,其效率提升的幅度。

對於專門寫中間層服務的我來說,JSON 也是門必須的功課(另一門是 XML for ClientDataSet),從李老師的文章可以得知使用的框架是【Readers and Writers JSON Framework】,在這邊引用官方新版文件內容:

2020/07/29

Delphi in Depth DataSnap 網站應用程式全端開發 出版



作者:吳祐賓





購書連結:
書本下載連結:PDF
範列下載連結:Github

內容簡介
  讓你從 0 到 1 進入全端開發領域,掌握後端知識同時也學會前端開發訣竅,點開 Web 開發新技能
   
  Delphi 進階框架 -- DataSnap 全方位構築後端知識。
  jQuery EasyUI 前端技術內涵及接近 VCL 元件的操作概念。
  資料庫常用操作。
  涵蓋語法入門,元件介紹等前後端整合實戰應用。

  給需要本書的人:
  ★有接觸過 JavaScript 卻不知道如何開始才能點開後端技能的人
  ★有接觸過 Delphi 但又不想打掉重練的人
  ★老是寫不好 Delphi 程式的人
  ★想運用 DataSnap 開發全端專案的人


本書特色

  1.本書採漸進式開發後台管理系統的全端網站應用程式,讓學習者能馬上做,立即學。
  2.全書程式碼毫無保留的呈現,重點處還會節錄再說明,更加強化理解與記憶內容。
  3.提供關於框架原理的圖說,讓讀者更能聚焦學習重點上。
  4.實作成品能立即應用在實戰中,實現超速學習成果。

專文推薦

    Eden 是我見過對 Delphi 最有愛的工程師,沒有之一。__【Delphi.KTOP 資深版主 Jason Wong】
   
    Eden 的堅持,是目前台灣地區 Delphi 不可或缺的精神,我從這本書裡面看到 Eden 的用心。__【Indy TIdDNSServer、Delphi / Kylix -Indy 網路程式設計作者 張子仁】

    本書從前端的 Javascript 說起,漸近地深入後端 DataSnap 實作,最後將前後端串起來,這樣的佈局,尤其對全端不熟的開發者而言,相信可以很快速的入門與應用 !__【Delphi.KTOP 副站長 蕭沖】


 到 Google Play 看看

到 Pubu 商城看看



2020/05/08

Preserving State in DataSnap REST Server



DataSnap REST Server 有儲存狀態的能力,這取決在LifeCycle的設定值。

DataSnap REST Server 儲存狀態方式一:LifeCycle

LifeCycle 的【狀態範圍】在TDSServerClass實例(Class Instance);有 Server, Session(Default), Invocation 三種,影響 TDSServerClass 實例(class instance) 的生命週期。

2020/05/06

JavaScript ES6 call DataSnap API with Promise Fetch

在【Async callback in JS DataSnap Framework】裡有提到可以使用【Handling the Result】,也就是Callback function,如此就能避免掉在XMLHttpRequest中已被棄用的【同步請求(Synchronous request)】。

不過呢,有一好就沒有二好,寫著寫著,我的程式碼就變得和下圖一樣:
傳說中的回呼地獄(Callback hell)
圖:取自網路

聽說JavaScript新標準ES6裡的Promise,它的出現就是為了解決Callback hell而發展出的解決方案。

2019/10/09

TIdHTTPWebBrokerBridge and HTTPS

為了提高網路傳輸的安全性,許多前端套件都開始強制要求使用HTTPS連線才能操作。

然而這在Delphi DataSnap / WebBroker server Debug很是困難,因為預設沒有 HTTPS。

自XE2版後,DataSnap精靈也可以看到HTTPS的選項。

但下一頁的憑證要求應該讓不少人傻眼吧。

文件裡寫的資料不多,很多OpenSSL的小技巧需要留意。

實作的程式碼就是 Indy HTTP SERVER + SSL,第一次看到實作碼時還不自覺地笑噴。





江湖一點訣啊!





結語

經實驗證明可以使用,但因為舊版 Indy 不支援 TLS1.1 以上加密等級,所以Browser會加上【弱加密】警告標語,請留意 Indy 使用版本。


See also :

2019/10/02

TIdHTTPWebBrokerBridge效能和驗證(Authorization)

圖/取自網路


TIdHTTPWebBrokerBridge 目前會用到的地方大概只有 Stand-Alone 場合,更偏向於 Debug 應用。

看到 Marco 寫的 Thread Pooling 文章,不太能夠理解只是Debug為什麼還需要這麼大的效能。

Thread Pooling

Marco原文是這樣說的:
Regarding threading, creating one for each incoming request is Indy’s IdHTTPServer default configuration, but you can tune it adding code to the server main form, which creates and manages the Web server component.
 大意上是說每個Client都會建立一條Thread,所以用了Thread Pooling後可以預先把Thread開好,就不用花時間在每次連接的Thread建立時間。

另一個好處是:限制Client數上限(MaxConnections),總比Server崩潰要好一點。

使用它不吃虧,就記錄一下要怎麼用吧!

2019/09/20

DevExtreme DataGrid Demo with DataSnap Server - The Front End

資料來源:網路


前面提到 DevExtreme DataGrid Demo with DataSnap Server 1 + 2,已經知道 DevExtreme DataGrid 是如何向後端伺服器取得資料,其它的『新增』、『更新』、『刪除』要如何實作呢?

在實作之前,要先知道 DataGrid 是如何動作的。

2019/09/11

DevExtreme DataGrid Demo with DataSnap Server 2/2

DataSnap 是 Delphi Enterprise 中極好用的 framework 之一!

隨著行動平台的使用人數提高,漸漸也就有了跨平台的需求。

商城上架費太貴、各平台開發的眉眉角角太多。



說白了就是想一套產品通吃各平台。

能滿足所有條件的只有 Web 了!

其實 Web 的水更深,箇中奧妙待日後細說。(笑)


上回提到 DataSnap REST Server 可以提取跨網站資料。

這篇有幾個目標:

2019/09/10

DevExtreme DataGrid Demo with DataSnap Server 1/2

DataSnap 是 Delphi Enterprise 中極好用的 framework 之一!


使用 Delphi 開發時大多遇到的都是資料庫應用,而其中 3rd party 最常用的就是 DevExpress 的 cxGrid 元件,導致在開發 Web 平台時也需要無痛移轉,使用者就是愛 cxGrid,所以在平台移轉上困難重重。

而 DevExpress 的明日之星【ExpressWeb Framework】卻早已停止開發! (已哭)

取而代之的是 ASPx 套件和 純 HTML5 的 DevExtreme framework。(喔氣氣氣氣氣氣!)

ASP.NET 套件試用好一陣子,不僅僅要熟悉 Dx 元件,再加上 ASP.NET C# 技術知識,別忘了還有前端的 HTML / CSS / JavaScript 的知識要學習,一個人的工作量也太大了。



在絕望之餘,才發現 Delphi 新版的 DataSnap 已經內建了 JavaScript framework,使用上也不算太困難,就差在前端 HTML 必須自行開發。

所謂的 JavaScript framework,意謂著前端的功能也必須使用 JavaScript 進行開發,當然也是有優缺點:

2019/03/16

Solution: Socket Error 10054 in DataSnap

Bug 保護色做得太真,導致找不到它
(示意圖/翻攝自Pixabay)

使用 SQLConnection 連接 DataSnap 的開發者都知道這是一種長連接的作法。

但這個作法有個缺點,就是如果 Client 發生瞬斷情形,在獲取資料會觸發以下例外:

  • EIdSocketError 10054 : Connection reset by peer.
  • EOleException: Connection Closed Gracefully.

在網路上看到解決方式是:
設置心跳包,每分鐘進行連線一次。

這個方式可以確保連線不會被默默切斷,只是這方式卻不能避免網路異常所導致的斷線情形。

再加上異常補獲的方式就更好了。

以下便是我的範例解法: