使用delphi 開發 web(五)Android 與delphi 服務器交互訪問數據庫


     近2年,隨着智能手機及平板電腦的快速發展,同時伴隨着3G 網絡的逐漸普及,移動開發越來越受到開發人員的青睞,而谷歌推出的Android 系統以其開放、優秀很快受到開發人員的推崇,很多知名網站都推出了Android 客戶端版本,例如騰訊、新浪、淘寶都有對應的版本。同時很多數據庫應用程序都從原來的windows 桌面程序延伸到移動設備上,由於移動設備的性能及內存等肯定無法與台式機及筆記本電腦相比,因此訪問數據庫也不可能像桌面安裝各種數據庫的客戶端,當然目前絕大多數數據庫也沒有直接運行在移動設備的客戶端。因此可以通過http 服務器中間建立一道橋梁,實現Android 訪問遠程數據庫。

    由於目前delphi 不支持Android 開發(據說XE3 可能會通過firemonkey 實現對Android 的支持),因此本人目前使用的Basic4android 開發Android 客戶端。主要是B4A 除了語法是類basic, 其他非常類似delphi,支持可視化設計,隱藏了很多不需要的細節。

其實在客戶端開發非常像前面的extjs,只是需要寫一些代碼從服務器端下載對應的JSON,然后對對應的JSON 解析,再顯示到對應的界面上。

   服務器端的腳本很簡單:

<%

   uses SysUtils, Classes;
var
  start,limit,sort,dir,phonenum,pass,sysnf:string;
  s,czh:string;
  plist:Tstringlist;
begin
 
 start:=request.queryfields.values['start'];
 limit:=request.queryfields.values['limit'];
 sort:=request.queryfields.values['sort'];
 dir:=request.queryfields.values['dir'];

 phonenum:=request.queryfields.values['phonenum'];
 pass:=request.queryfields.values['pass'];
 sysnf:=request.queryfields.values['sysnf'];
 
 if phonenum='' then
  begin
    print('error111');
    exit;   
  end;
 if pass='' then
  begin
    print('error111');
    exit;   
  end;
 
  if sysnf='' then
  begin
    print('error222');
    exit;   
  end;
 
  with cx do
  begin
    sql.clear;
    sql.add('select * from   CZYB where sysnf=:sysnf and dxjsm=:phonenum '); 
    params[0].asstring:=sysnf;
    params[1].asstring:=phonenum;
 
    open;
    
    if isempty then
      begin
        print('error111');
        exit;   
      end;
  czh:=fieldbyname('CZH').asstring;  
  end;
 
 
try
   plist:=Tstringlist.create;
   s:='select  XH,XM,LYDSMC,to_char(CJSJ,''yyyy-mm-dd'') as CJSJ from xsjlb a where a.nf=:NF and nvl(a.lyqxdm, a.lydsdm) ';
  s:=s+' in (SELECT dm FROM CZYSFB WHERE CZH=:CZH AND SYSNF=:NF AND SYSBZ=''T'') ';
  if sort<>'' then
     s:=s+' order  by "'+sort+'"'+ ' '+dir;
  plist.add('CZH='+czh);
  plist.add('NF='+sysnf);
   
   
   wm.datatojsonzip( s,'0','500',plist);
finally
    plist.free;
end;
end.

%>

      和前面extjs 的略微不同的是 datatojsonzip 函數,這個函數是在datatojson 的基礎上增加了壓縮功能。因為使用3G 的話,一定要控制網絡流量(唉,3G 什么時候10元包月呢?),

我做的系統經過測試原來的664 條數據的JSON 封裝文本的大小約為64.3 KB,經過壓縮后,生成的壓縮流約為8.97 KB,不到原來大小14%,

大大的提高了網絡傳輸效率及訪問數據庫的速度,也減少了網絡流量,節省了上網費用。

     同時隨着移動終端及網絡的快速發展,網絡上數據傳輸的安全問題也越來越大,一旦出現安全問題,系統的信息就會泄漏失密,導致不可預測的后果。

而WEB應用服務器在互聯網上是通過HTTP 協議傳輸信息,都是通過明碼傳輸的,可以通過軟件或者硬件的方法得到HTTP傳輸的內容,這一點是非常不安全的,

當然可以通過HTTPS 實現安全傳輸,但是需要在服務器上安裝證書,客戶端也必須支持HTTPS,實際應用中比較麻煩,因此考慮自行加密傳輸內容,

並在客戶端通過短信等方式給信任終端下發解密密碼,Android 設備使用下發(可通過短信或郵件等方式)的密碼進行解密,恢復原始數據。

同時為了保證系統的通用性,服務器和客戶端都采用3DES 來加密和解密。

    在Android 終端里面解析JSON 也很簡單,代碼如下:

  Sub loadxinxi(s As String)
    Dim JSON As JSONParser
    Dim Master As Map
    Dim records As List
    
    Dim XINXI As Map
    
    Dim recordcount As String
    ClearAll
     Dim h(4) As String
    h(0)="序號"
    h(1)="姓名"
    h(2)="地市"
    h(3)="日期"
    
    NumberOfColumns = h.Length
    ColumnWidth = SV.Width / NumberOfColumns 'update the columns widths
    ColumnWidth_1 = ColumnWidth-ColLineWidth
    SetHeader(h)
    If s.Length<20 Then
        Msgbox("沒有報名信息","提示")
       Return
     End If  
    JSON.Initialize(s)
    master = JSON.NextObject
    
    records=master.Get("topics")

    Dim data(4) As String
    Dim row() As String
    
    showcount=records.Size
    For i=0 To showcount-1
    
        XINXI=records.Get(i)
        data(0)=xinxi.Get("XH")
        data(1)=xinxi.get("XM")
        data(2)=xinxi.get("LYDSMC")
        data(3)=xinxi.get("CJSJ")
        
        row =data
        AddRow(row)
    Next
    recordcount=master.Get("totalCount")
    h(0)="合計"
    h(1)=recordcount&"條"
    h(2)=""
    h(3)="前"&showcount&"條"
   setfooter(h)
 

End Sub

 

  最后的運行界面為

   
    

   
 
Delphi web 開發今天就暫時告一個段落,現在我們實現的delphi web 功能基本上都是直接連接數據庫的,
中間沒有實現數據庫的緩存和池,也沒有實現業務邏輯,因此比較適合中小型網站的使用,后面我會開始介紹
多層開發,介紹完后,再把多層與現在的web 開發結合起來,真正實現企業級的web 應用。

   

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM