DelphiXE3中创建WebService(服务端+客户端) 1
DelphiXE3新建WebService具体操作:
1.打开“DelphiXE3”->“File”->“New”->“Other”
2.“New Items”->“Delphi Projects”->“WebSrvice”->“SOAP Server Application”
3.“Stand-alone application”->“Next”
4.“VCL application”->“Next”
5.“8082”->“Finish” 端口可以自行修改,防止与tomcat的冲突,建议不要用8080端口
6.“Create Interface for SOAPmodule?”->“Yes”
7.“Add New WebService”->输入服务名字“MyData”->“OK”
8.保存全部工程文件
9.在“WebModuleUnit1”单元中放入控件: 我是需要连接oracle,所用用了ODAC的组件,其他也可以选择ADO或是fireDAC
TOraSession
TOraQuery
DataSetProvider1
ClientDataSet1
10.双击oracSession 设置好本地连接,并测试通。
11.TOraQuery1->session:oracSession
12.DataSetProvider1->DataSet:=FDQuery1
13.ClientDataSet1->ProvideName:=DataSetProvider1
unit WebModuleunit1;
interface
uses
System.SysUtils, System.Classes, Web.HTTPApp, Soap.InvokeRegistry, Soap.WSDLIntf,
System.TypInfo, Soap.WebServExp, Soap.WSDLBind, Xml.XMLSchema, Soap.WSDLPub,
Soap.SOAPPasInv, Soap.SOAPHTTPPasInv, Soap.SOAPHTTPDisp, Soap.WebBrokerSOAP,
Data.DB, MemDS, DBAccess, Ora, Datasnap.DBClient, Datasnap.Provider;
type
TWebModule1 = class(TWebModule)
HTTPSoapDispatcher1: THTTPSoapDispatcher;
HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
WSDLHTMLPublish1: TWSDLHTMLPublish;
dtstprvdr1: TDataSetProvider;
ds1: TClientDataSet;
orsn1: TOraSession;
orqry1: TOraQuery;
procedure WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
function GetInfo: widestring;
function SetSQL(ASQL: widestring): widestring;
{ Public declarations }
end;
var
WebModuleClass: TComponentClass = TWebModule1;
implementation
{$R *.dfm}
function TWebModule1.GetInfo: widestring;
begin
ds1.Close;
ds1.Open;
Result := ds1.XMLData;
ds1.Close;
end;
function TWebModule1.SetSQL(ASQL: widestring): widestring;
begin
orqry1.Close;
orqry1.SQL.Text := ASQL;
try
orqry1.ExecSQL;
Result := '成功';
except
Result := '失败';
end;
end;
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;
end.
{ Invokable interface Imydata }
unit mydataIntf;
interface
uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns;
type
{ Invokable interfaces must derive from IInvokable }
Imydata = interface(IInvokable)
['{A95FAF6B-C38B-4FE9-8B8E-23DF5983D30E}']
function GetInfo:widestring;stdcall;
function SetSQL(ASQL: widestring): widestring;stdcall;
{ Methods of Invokable interface must not use the default }
{ calling convention; stdcall is recommended }
end;
implementation
initialization
{ Invokable interfaces must be registered }
InvRegistry.RegisterInterface(TypeInfo(Imydata));
end.
{ Invokable implementation File for Tmydata which implements Imydata }
unit mydataImpl;
interface
uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, mydataIntf;
type
{ Tmydata }
Tmydata = class(TInvokableClass, Imydata)
public
function GetInfo:widestring;stdcall;
function SetSQL(ASQL: widestring): widestring;stdcall;
end;
implementation
uses WebModuleUnit1;
{ Tmydata }
function Tmydata.GetInfo: widestring;
var
oDM: TWebModule1;
begin
oDM := TWebModule1.Create(nil);
result := oDM.GetInfo;
oDM.Free;
end;
function Tmydata.SetSQL(ASQL: widestring): widestring;
var
oDM: TWebModule1;
begin
oDM := TWebModule1.Create(nil);
result := oDM.SetSQL(ASQL);
oDM.Free;
end;
initialization
{ Invokable classes must be registered }
InvRegistry.RegisterInvokableClass(Tmydata);
end.
DelphiXE3中找不到wsdl importer,改到delphi 7 中进行,具体操作:
1.打开“Delphi7”->“File”->“New”->“Other”
2.“New Items”->“Delphi Projects”->“WebSrvice”->“WSDL Importer”
3.“Import WSDL”->WSDL Source中输入“http:/172.16.10.41:8082/wsdl/IMyData”->“Next”
4.“Automatic SOAP versioning.(Recommended)”->“Next”
5.默认选项->“Finish”
6.Delphi会自动生成IMyData文件->保存
7.放入控件
ClientDataSet1
DataSource1
DBGrid1
8.DataSource1->DataSet:=ClientDataSet1
9.DBGrid1->DataSource:=DataSource1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, DBClient;
type
TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
IMyData1;
procedure TForm1.Button1Click(Sender: TObject);
var
ows: IMyData;
s: string;
begin
ows := GetIMyData(true, 'http://172.16.10.41:8082/wsdl/IMyData', nil); //参数中可以使用配置的url
s := ows.GetInfo;
if length(s) <> 0 then
ClientDataSet1.xmldata := s;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
ows: IMyData;
s: string;
begin
if Edit1.Text = '' then
begin
Application.MessageBox('请输入要删除的员工姓名', '操作错误');
exit;
end;
ows := GetIMyData(true, 'http://172.16.10.41:8082/wsdl/IMyData', nil); //参数中可以使用配置的url
s := ows.SetSQL('delete from employee where 姓名=' + QuotedStr(Edit1.Text));
if length(s) <> 0 then
Application.MessageBox('已删除成功', '提示');
end;
end.
编译并运行服务端:
运行客户端: