用Delphi 實現WebService

一編寫服務程序java

第一步:File----->New----->Other------>WebServices----->Soap Server Applicationweb

選擇ISAPI/NSAPI Dynamic Link Library而後肯定。生成一個框架。後面的大部分原代碼都須要本身手工添加服務器

第二步:定義一個接口單元。先經過嚮導生成一個空的單元文件,而後在此單元中實現基本的接口(Iinvokable)和定義之後客戶端程序能夠調用的方法,原代碼以下:網絡

unit unit1;
interface
uses  InvokeRegistry;//基本的結構和方法的定義都在此單元中,必須引用
type
IWebTest=interface(Iinvokable)//自定義的一個結構,繼承自Iinvokable
['{A436B0D2-D490-4C80-820A-355D979E8704}']//經過Ctrl+Shift+G生成的一個GUID
function gettext():widestring;stdcall;//自定義的一個方法,也是之後客戶能夠調用的方法
end;
implementation框架

initialization//初始化
InvRegistry.RegisterInterface(Typeinfo(IWebTest));//經過此方法來註冊接口
end.ide

第三步:實現第二步中所定義的接口和方法。先經過嚮導生成一個空的單元文件,而後定義自定義接口(IWebtest)的實現類。原代碼以下:編碼

unit Unit2;spa

interface
uses  InvokeRegistry,Unit1;//引用自定義的接口單元
type
TWebTest=class(TInvokableClass,IWebTest)//定義實現類,此類必須繼承自TInvokableClass,並實現自定義接口
protected
function gettext():widestring;stdcall;//申明在自定義接口中所定義的方法
end;
implementationorm

{ Test }
procedure createwebtest(out obj:tobject);//此過程爲建立類實例,必須手工添加
begin
obj:=TWebTest.Create;//建立類實例
end;
function TWebTest.gettext: widestring;//實現自定義方法
begin
Result:='Success';
end;
initialization//初始化
InvRegistry.RegisterInvokableClass(TWebTest,createwebtest);//註冊自定義類
end.xml

第四步:編譯整個應用程序,即產生一個*.dll的程序,把此程序拷貝到IIS的Cgi-bin目錄下(或者其餘可執行的目錄,要根據本身的目錄來選擇),而後便可經過如下方式的連接訪問到Wsdl:http://192.168.1.222/cgi-bin/*.dll/wsdl訪問到以XML方式編碼的Wsdl文件了,這就是客戶端程序調用須要的文件。其中*.dll爲你本身的應用程序的名字。192.168.1.222爲你的Web服務器地址。Cgi-bin爲你的Web服務器的能夠執行Cgi程序的目錄名稱。


二編寫客戶程序:

第一步:新建一個Application。

第二步:File----->New----->Other------>WebServices----->Soap Services Importer

而後在Wsdl or Xml Schema Location中填入:http://192.168.1.222/cgi-bin/*.dll/wsdl/IWebTest,而後肯定即生成了一個新的接口定義單元。

第二步:在主form上放上一個按鈕和一個Httprio組件(在WebServices頁上),並引用第二個單元(即經過Soap Services Importer自動生成的單元)

在Httprio的屬性頁上的WsdlLocation裏面填上http://192.168.1.222/cgi-bin/*.dll/wsdl/IWebTest;而後在Httprio屬性頁上的Port和Service上選擇上相應的數據便可。

第三步:書寫客戶調用程序,原代碼以下:

procedure TForm1.Button1Click(Sender: TObject);
var
testobj:IWebTest;//定義對象
begin
testobj:=Httprio1 as IWebTest;//建立對象
showmessage(testobj.gettext);//調用方法
end;

以上轉自,網絡是一個簡單的例子,有興趣的能夠和我討論。以上的例子還用java客戶調用經過。做者郵箱是coala@21cn.com



Server 端:

SoapDataModule中加入 ADOConnection一、ADODataSet一、DataSetProvider1;DataSetProvider1的DataSet設置爲ADODataSet1;ADODataSet1的CommandText設置爲空,Connection設置爲ADOConnection1。

DataSetProvider1的DataRequest事件:
function TDataMod.DataSetProvider1DataRequest(Sender: TObject;
 Input: OleVariant): OleVariant;
begin
   if ADOConnection1.Connected then
   begin
       ADODataSet1.CommandText := Input;
       Result := DataSetProvider1.Data;
   end;
end;  

procedure TDataMod.SoapDataModuleCreate(Sender: TObject);
var
 DataPath: string;
const
 SQL :string = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\programs\Delphi7\Demos\WebServices\SOAPDataModule\Data\Tree.mdb;Persist Security Info=False';
begin
 DataPath := ExtractFilePath(Application.ExeName)+ '..\Data\';
 XMLTransformProvider1.XMLDataFile := DataPath + 'XML_Document.xml';
 XMLTransformProvider1.TransformRead.TransformationFile := DataPath + 'ToDp.xtr';
 XMLTransformProvider1.TransformWrite.TransformationFile := DataPath + 'ToXml.xtr';
  try
  ADOConnection1.Connected :=false;
  ADOConnection1.ConnectionString:= SQL;
  ADOConnection1.Connected :=true;
  except
     //showmessage(A_ParentPath+'Data\InfoMat.mdb 調用失敗');
  end;
end;

Client端:

SoapConnection一、ClientDataSet1;ClientDataSet1的ConnectionBroker屬性爲SoapConnection1,ProviderName屬性爲DataSetProvider1

查詢記錄集: procedure TClientForm.Button1Click(Sender: TObject); var SQL:string; begin  if not SoapConnection1.Connected then  begin    SoapConnection1.URL:=URLList.Text+'/soap/IDataMod';    SoapConnection1.Open;  end;  SQL := Edit1.text;  with ClientDataSet1 do  begin    Data := DataRequest(SQL);  end; end;
相關文章
相關標籤/搜索