设为首页 收藏本站
查看: 1043|回复: 0

[经验分享] delphi7开发webservice部属在apache服务器中 转

[复制链接]

尚未签到

发表于 2015-8-1 12:57:50 | 显示全部楼层 |阅读模式
  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
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-93023-1-1.html 上篇帖子: 用jk整合Apache和tomcat实现负载均衡 下篇帖子: ASP.NET中使用Apache log4net
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表