zoukankan      html  css  js  c++  java
  • delphi7开发webservice部属在apache服务器中 转

    delphi7开发webservice部属在apache服务器中


    delphi7 webservice apache
    用Delphi7开发Web Service程序,并把服务程序放在apache Web服务器上提供给各种客户程序调用。


    第一步 编写服务程序

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

    选择CGI Stand-alone executable然后确定,然后输入接口名字。

    第二步:定义一个接口单元。先通过向导生成一个空的单元文件,然后在此单元中实现基本的接口(Iinvokable)和定义以后客户端程序可以调用的方法,原代码如下:

    接口代码
    Java代码 收藏代码
    { Invokable interface IMyWeb }

    unit MyWebIntf;

    interface

    uses InvokeRegistry, Types, XSBuiltIns;;//基本的结构和方法的定义都在此单元中,必须引

    type

    { Invokable interfaces must derive from IInvokable }
    IMyWeb = interface(IInvokable) //自定义的一个结构,继承自Iinvokable
    ['{E3070F4D-AEBF-47D6-963B-ADFFC4E7C7A1}'] //通过Ctrl+Shift+G生成的一个GUID


    { Methods of Invokable interface must not use the default }
    { calling convention; stdcall is recommended }
    function gettext():widestring;stdcall;//自定义的一个方法,也是以后客户可以调用的方
    end;

    implementation

    initialization
    { Invokable interfaces must be registered }
    InvRegistry.RegisterInterface(TypeInfo(IMyWeb));//通过此方法来注册接

    end.


    第三步:实现第二步中所定义的接口和方法。先通过向导生成一个空的单元文件,然后定义自定义接口(IWebtest)的实现类。原代码如下:

    实现接口代码

    Java代码 收藏代码
    { Invokable implementation File for TMyWeb which implements IMyWeb }

    unit MyWebImpl;

    interface

    uses InvokeRegistry, Types, XSBuiltIns, MyWebIntf,Unit1;//引用自定义的接口单元


    type

    { TMyWeb }
    TMyWeb = class(TInvokableClass, IMyWeb)//定义实现类,此类必须继承自TInvokableClass,并实现自定义接

    public
    function gettext():widestring;stdcall;//申明在自定义接口中所定义的方法
    end;

    implementation
    function TMyWeb.gettext: widestring;//实现自定义方法
    begin
    Result:='Success';
    end;

    initialization
    { Invokable classes must be registered }
    InvRegistry.RegisterInvokableClass(TMyWeb);

    end.

    第四步:编译整个应用程序,即产生一个*.exe的程序,把此程序拷贝到apache的Cgi-bin目录下,然后即可通过以下方式的链接访问到Wsdl:http://127.0.0.1/cgi-bin/*.exe访问到以XML方式编码的Wsdl文件了,这就是客户端程序调用需要的文件。其中*.exe为你自己的应用程序的名字。127.0.0.1为你的Web服务器地址。Cgi-bin为你的Web服务器的可以执行Cgi程序的目录名称 或 虚拟目录名称。

    第二步 编写客户程序:

    第一步:新建一个Application。

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

    然后在Wsdl or Xml Schema Location中填入:.exe/wsdl/IMyWeb,然后确定即生成了一个新的接口定义单元。
    生成的代码

    Java代码 收藏代码
    // ************************************************************************ //
    // The types declared in this file were generated from data read from the
    // WSDL File described below:
    // WSDL : http://127.0.0.1:8090/cgi-bin/Project2.exe/wsdl/IMyWeb
    // Encoding : utf-8
    // Version : 1.0
    // (2011-7-22 16:14:10 - 1.33.2.5)
    // ************************************************************************ //

    unit IMyWeb1;

    interface

    uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

    type

    // ************************************************************************ //
    // The following types, referred to in the WSDL document are not being represented
    // in this file. They are either aliases[@] of other types represented or were referred
    // to but never[!] declared in the document. The types from the latter category
    // typically map to predefined/known XML or Borland types; however, they could also
    // indicate incorrect WSDL documents that failed to declare or import a schema type.
    // ************************************************************************ //
    // !:string - "http://www.w3.org/2001/XMLSchema"


    // ************************************************************************ //
    // Namespace : urn:MyWebIntf-IMyWeb
    // soapAction: urn:MyWebIntf-IMyWeb#gettext
    // transport : http://schemas.xmlsoap.org/soap/http
    // style : rpc
    // binding : IMyWebbinding
    // service : IMyWebservice
    // port : IMyWebPort
    // URL : http://127.0.0.1:8090/cgi-bin/Project2.exe/soap/IMyWeb
    // ************************************************************************ //
    IMyWeb = interface(IInvokable)
    ['{85474E46-8BF2-FC4E-8A91-6FC82BB6EBF1}']
    function gettext: WideString; stdcall;
    end;

    function GetIMyWeb(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IMyWeb;


    implementation

    function GetIMyWeb(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IMyWeb;
    const
    defWSDL = 'http://127.0.0.1:8090/cgi-bin/Project2.exe/wsdl/IMyWeb';
    defURL = 'http://127.0.0.1:8090/cgi-bin/Project2.exe/soap/IMyWeb';
    defSvc = 'IMyWebservice';
    defPrt = 'IMyWebPort';
    var
    RIO: THTTPRIO;
    begin
    Result := nil;
    if (Addr = '') then
    begin
    if UseWSDL then
    Addr := defWSDL
    else
    Addr := defURL;
    end;
    if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
    else
    RIO := HTTPRIO;
    try
    Result := (RIO as IMyWeb);
    if UseWSDL then
    begin
    RIO.WSDLLocation := Addr;
    RIO.Service := defSvc;
    RIO.Port := defPrt;
    end else
    RIO.URL := Addr;
    finally
    if (Result = nil) and (HTTPRIO = nil) then
    RIO.Free;
    end;
    end;


    initialization
    InvRegistry.RegisterInterface(TypeInfo(IMyWeb), 'urn:MyWebIntf-IMyWeb', 'utf-8');
    InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IMyWeb), 'urn:MyWebIntf-IMyWeb#gettext');

    end.

    第二步:在主form上放上一个按钮, 并引用第二个单元(即通过Soap Services Importer自动生成的单元)

    第三步:编写客户调用程序,原代码如下:

    Java代码 收藏代码
    unit MyWebImpl;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs,IMyWeb1, StdCtrls;
    //IMyWeb1 为引入自动生成的webservice服务器接口
    type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    testobj:IMyWeb;//定义对象
    begin
    testobj:=GetIMyWeb;//创建对象
    showmessage(testobj.gettext);//调用方法
    end;


    end.


    最后运行程序,点击Button,会弹出success的对话框,证明测试成功。
    本人是初学delphi,很多方面不是很懂,通过浏览和总结网络中的例子,自己测试通过。因为网上好多例子不能运行,(可能是自己有些地方不懂吧)所以自己把测试通过的项目发布到博客中。

    源码下载地址:  http://yunpan.cn/Q9mrPhqBB8Dhj

  • 相关阅读:
    HTTP基础及telnet简单命令
    【详解】并查集高级技巧:加权并查集、扩展域并查集
    二叉树中两节点的最近公共父节点(360的c++一面问题)
    (用POJ 1160puls来讲解)四边形不等式——区间dp的常见优化方法
    详细讲解Codeforces Round #625 (Div. 2)E
    详细讲解Codeforces Round #625 (Div. 2) D. Navigation System
    详细讲解Codeforces Round #624 (Div. 3) F. Moving Points
    详细讲解Codeforces Round #624 (Div. 3) E. Construct the Binary Tree(构造二叉树)
    POJ
    新手建站前需要做哪些准备?
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/3397360.html
Copyright © 2011-2022 走看看