Delphi调用WebService的实例(非常经典)
- 格式:doc
- 大小:54.00 KB
- 文档页数:7
1.什么是webserviceWeb service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。
这就是说,你能够用编程的方法通过Web来调用这个应用程序。
对Web service 更精确的解释:Web services是建立可互操作的分布式应用程序的新平台。
作为一个Windows程序员,你可能已经用COM或DCOM建立过基于组件的分布式应用程序。
COM是一个非常好的组件技术,但是我们也很容易举出COM并不能满足要求的情况。
Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。
你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
不管你的Web service是用什么工具,什么语言写出来的,只要你用SOAP协议通过HTTP 来调用它,总体结构都应如下图所示。
通常,你用你自己喜欢的语言(如VB 6或者)来构建你的Web service,然后用SOAP Toolkit或者.NET的内建支持来把它暴露给Web客户。
于是,任何语言,任何平台上的客户都可以阅读其WSDL文档,以调用这个Web service。
客户根据WSDL描述文档,会生成一个SOAP请求消息。
Web service 都是放在Web服务器(如IIS) 后面的,客户生成的SOAP请求会被嵌入在一个HTTP POST请求中,发送到Web服务器来。
Web服务器再把这些请求转发给Web service 请求处理器。
对VB 6程序来说,Web service请求处理器是一个与SOAP Toolkit组件协同工作的ASP页面或ISAPI extension。
而对程序来说,Web service请求处理器则是一个.NET Framework自带的ISAPI extension。
请求处理器的作用在于,解析收到的SOAP请求,调用Web service,然后再生成相应的SOAP应答。
delphi调⽤C#写的webservice看以下的⼀个例⼦(转)先⽤创建⼀个简单的webservices;1.打开2003 新建⼀个webservises 命名为WebService12.添加两个WebMethod[WebMethod]public string HelloWorld(){return"Hello World ⽤.NET写的web服务!!^_^ ";}[WebMethod]public string datetostr(DateTime dt)//将时间转换为字符{return dt.ToUniversalTime().ToString();} 完整代码using System;using System.Collections;using ponentModel;using System.Data;using System.Diagnostics;using System.Web;using System.Web.Services;namespace WebService1{public class Service1 : System.Web.Services.WebService{public Service1(){//CODEGEN: 该调⽤是 Web 服务设计器所必需的InitializeComponent();}#region组件设计器⽣成的代码//Web 服务设计器所必需的private IContainer components = null;///<summary>///设计器⽀持所需的⽅法 - 不要使⽤代码编辑器修改///此⽅法的内容。
///</summary>private void InitializeComponent(){}///<summary>///清理所有正在使⽤的资源。
///</summary>protected override void Dispose( bool disposing ){if(disposing && components != null){components.Dispose();}base.Dispose(disposing);}#endregion[WebMethod]public string HelloWorld(){return"Hello World ⽤.NET写的web服务!!^_^ ";}[WebMethod]public string datetostr(DateTime dt)//将时间转换为字符{return dt.ToUniversalTime().ToString();}}}1下⾯在打开delphi 72新建⼀个应⽤程序:拖两个button两个edit 和⼀个HTTPRIO(在webservices页上)到窗体上;3.接下来:File-> new-> other-> webservices-> WSDL importer点击next 导⼊保存unit Service14.在unit1(form1 的单元⽂件)中引⽤Service1, XSBuiltIns5. HTTPRIO1的(特别注意)。
delphi调用webservice超时
司有个老业务系统,用的是delphi6开发。
需要调用webservice,但发现调用超时30秒弹出异常的问题。
网上查询,说delphi7的THTTPRIO控件设置超时属性就行了。
但delphi6没有这个属性,只能从底层修改了。
步骤:
1.打开delphi的VCL 源码,找到SOAPHTTPTrans.pas文件,把这个文件拷到项目工程文件的目录,并加到工程中。
这样Delphi源文件修改后才能够生效。
2.找到procedure THTTPReqResp.Connect(Value: Boolean);行
3.写义一个变量:
Timeout:DWORD;
4.
在 FInetRoot := InternetOpen(PChar(FAgent), AccessType, PChar (FProxy), PChar(FProxyByPass), 0);代码前添加如下代码行:
//设置10分钟超时,10分钟一般够用了。
Timeout:=600000;
InternetSetOption(nil, INTERNET_OPTION_RECEIVE_TIMEO UT ,
@Timeout, sizeof(Timeout));
4.重新编译项目,运行程序。
以后webservice就不会受限于30秒超时报异常的问题了!。
如何⽤delphi2005的WebService返回各种类型数据⼀、建⽴WebService⽂件,⼆、引⼊.Net下的Unit,并改名为ClassFactory,三、在WebService中的Uses中加⼊ClassFactory。
四、注意WebService中的每⼀个⽅法都要有[WebMethod]作引导。
具体程序如下:==========================以下为WebService的单元⽂件==========================unit WebService1;interfaceuses System.Collections, ponentModel, System.Data, System.Diagnostics, System.Web, System.Web.Services, System.Data.Odbc, Borland.Data.Provider, ClassFactory;type /// <summary> /// Summary description for WebService1. /// </summary> TWebService1 = class(System.Web.Services.WebService) {$REGION 'Designer Managed Code'} strict private /// <summary> /// Required designer variable. /// </summary> procedure InitializeComponent; {$ENDREGION} strict protected /// <summary> /// Clean up any resources being used. /// </summary> procedure Dispose(disposing: boolean); override; private { Private Declarations } public constructor Create; // Sample Web Service Method [WebMethod] function HelloWorld: string; [WebMethod] function YourName(NameNo:Integer): string; [WebMethod] function getEmp(NameNo:Integer): TEmpInfo; [WebMethod] function getDoubleArray(DoubleNo:Double): TArrayOfDouble; [WebMethod] function getIntegerArray(IntegerNo:Integer): TArrayOfInt; end;implementation{$REGION 'Designer Managed Code'}/// <summary>/// Required method for Designer support - do not modify/// the contents of this method with the code editor./// </summary>procedure TWebService1.InitializeComponent;begin{$ENDREGION}constructor TWebService1.Create;begin inherited; // // Required for Designer support // InitializeComponent; // // TODO: Add any constructor code after InitializeComponent call //end;/// <summary>/// Clean up any resources being used./// </summary>procedure TWebService1.Dispose(disposing: boolean);begin if disposing and (components <> nil) then components.Dispose; inherited Dispose(disposing);end;// Sample Web Service Method// The following method is provided to allow for testing a new web service. function TWebService1.HelloWorld: string;begin Result := 'Hello World';end;function TWebService1.YourName(NameNo: Integer): string;begin if NameNo<>0 then Result:='YourName is Bird' else Result:='YourName Is null';end;function TWebService1.getEmp(NameNo: Integer): TEmpInfo;begin Result:=TEmpInfo.create; :='Apple'; Result.Age :=13+NameNo;end;function TWebService1.getDoubleArray(DoubleNo: Double): TArrayOfDouble; var I:Integer;begin SetLength(Result,6); For I:=0 to 5 do begin Result[I]:=DoubleNo+I; end;end;function TWebService1.getIntegerArray(IntegerNo: Integer): TArrayOfInt;var I:Integer;begin SetLength(Result,6); For I:=0 to 5 do begin Result[I]:=IntegerNo+I; end;end;end.========================以下为ClassFactory的单元⽂件======================== unit ClassFactory;interfacetypeTEmpInfo = Class Private FName :String; FAge :Integer; Published Property Name :String Read FName Write FName; Property Age :Integer Read FAge Write FAge;end;TArrayOfInt = array of Integer;TArrayOfDouble = array of Double;implementationend.。
Delphi7调用C#WebService我有一支老舊的 Delphi 7 程序具有發送 SMTP 的功能, 功能整合, 需要調用 C# WebService 發送郵件功能,發現 Delphi 7并不能像 C# 一樣, 添加了 WebService 后就可以直接使用, 而在 Delphi XE 2或5中卻很方便.可是 Delphi XE 的破解補丁用一段時間失效了, 需要重新安裝系統才能破解.無奈之下, 只好使用 Delphi 7 . 上網查了一些資料, Delphi 7 調用WebService 需要多寫幾行代碼.一、添加 WebService點擊菜單 File --> New --> Other選擇 WebServices 的 WSDL Importer, 點擊 OK輸入 WebService 的地址, 后面加 ?wsdl點擊完成按鈕到此,WebService 添加完成, 專案會自動增加 service1.pas二、修改代碼在service1.pas 的最下面,添加以下一行, 其中Service1Soap 根據實際名稱不同而不同InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap), ioDocument);添加后的代碼如下:引用 WebService 需要的組件, 申明變量, 初始化后就可以直接調用了,完整代碼如下:program Project2;{$APPTYPE CONSOLE}usesSysUtils,InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns,service1 in 'service1.pas';varWebService1: Service1Soap;mHttpRIO: THTTPRIO;webservice_result: string;begin{ TODO -oUser -cConsole Main : Insert code here }mHttpRIO := THTTPRIO.Create(nil);mhttprio.URL := 'http://192.168.1.108:6666/service1.asmx';eUTF8InHeader := true;mhttprio.Converter.Encoding := 'UTF-8';Webservice1 := mhttprio as Service1Soap;//調用webservice_result := webservice1.SendMail('根據實際需要填寫參數');end.調試運行, webservice_result 就是調用webservice返回的結果.。
Delphi调⽤WebService的实例(⾮常经典)Delphi 调⽤webservice 经典实例Dispatch: 派遣,分派 Invoke: 调⽤ Invokable: 可调⽤接⼝TReomtable: WebService中⾃定义类都是继承⾃该类 TSOAPAttachment: Attachment:附件,⼀种流类型,可以返回流数据 CGI:(EXE)ISAPI:(DLL) Base64编码: uses EncdDecd; s := EncodeString(s); //加 base64 编码 s := DecodeString( str ); //解码 UTF8: UTF8 是8位的UNICODE字符,⽽ASCII是7位 ,gb2312和unicode是2字节/字,utf8是3字节/字utf8类似以前的8位转7位的编码,是为了在⽹络间不同系统的通讯⽅便⽽作的转换。
⼏乎所有⽤.Net写的WebService只⽀持DOC⽅式、Delphi写的只⽀持RPC⽅式;J2ME⽬前对Web Service的⽀持仅限于RFC172,⽽ RFC172要求必须为DOC⽅式(sun怎么偏袒MS?)!为了在设计中减少障碍,下⾯还介绍⼏个概念。
1) SOAP:SOAP是⼀种简单有效的数据传输协议,⽤于分布式⽹络环境下数据信息交换,它以XML 作为数据传输的格式,搭配Internet上标准的传输协议HTTP、SMTP、TCP等来传送信息。
从本质上看,SOAP事实上只是将Request和Response经由XML格式把数据打包,达到双⽅沟通的⽬的。
2) WSDL:WSDL(Web Service Description Language)是⼀种以XML格式描述的Web Service语⾔,当Web Service Provider 要对外公布提供的 Web Service,就需要通过WSDL来构建描述语⾔。
在WSDL中有两个⾮常重要的要素::此WSDL⽂件所要描述的Web Service集合;每⼀个Port代表外界Client可以和此Service沟通的⼀个进⼊点,⼀个Port会指定⼀个Binding⽅式。
Delphi通过WebService开发Web服务端和手机客户端介绍本文章介绍了Delphi XE5通过WebService 开发Web服务端和手机客户端,下面是操作的详细过程。
我们开发一个三层的android程序建立一个webservices stand-alone vcl application 作为手机访问的服务端1、new->other->webservices2、选择stand-alone vcl application3、这里使用默认端口80804、选择创建接口5、给服务起个名字6、点ok后保存工程,保存为目录如下:7、至此为止,什么代码都不写,点击运行,我们看到8、启动并点击open browser按钮在浏览器里看到一个web服务就创建完成了。
接下来创建一个返回数据集的过程,用webservices发布,供手机端调用。
这里我使用firedac1、打开上一篇自动创建的WebModule然后分别拖放以下数据连接控件FDConnection1:firedac连接数据库的FDPhysMSSQLDriverLink1: 数据驱动选的是sqlserver ,另外还有db2 ,oracle,acess ,excel ,sqllite,mysql等FDQuery1: 相当于adoqueryDataSetProvider1:delphi的providerClientDataSet1: delphi的我最喜欢的cds2、数据库的连接首先用 FDConnection1 连接sqlserver 服务器,在控件上邮件设置一下信息3、其他数据控件连接FDquery1已经自动连上了connection,我们在sql里写以下语句接下来DataSetProvider1 连好fdquery1,clientdataset1的providername 选择DataSetProvider14、在WebModule 中的public中实现以下代码functionTAndroidWM.GetEmployee_Mi: widestring;beginwith clientdataset1 dobeginclose;open;result:=xmldata;close;end;end;5、在AdroidServicesImpl.pas 引用WebModule 的接口实现的public单元实现以下代码functionGetEmployee_mi:widestring;stdcall;functionTAdroidServices.GetEmployee_mi: string;vardm:TAndroidWM;begindm:=TAndroidWM.Create(nil);result:=dm.GetEmployee_Mi;dm.Free;end;6、在AdroidServicesIntf.pas 单元实现以下代码typeIAdroidServices =interface(IInvokable) ['{9B1596C5-AD 43-4849-830E-0B82D8BAA043}']functionGetEmployee_mi:widestring;stdcall;end;6、运行server 查看webservice是否实现了GetEmployee_mi服务服务端至此完成,实现了用clientdataset 的xmldata返回数据集的过程,当然您可以对返回的xml进行压缩和解压缩的操作,减小网络传输压力。
篇《深入理解webservice客户端调用例子》一、引言在当今信息化时代,互联网技术的应用范围越来越广,web服务作为一种轻量级的网络服务技术,以其跨评台、松耦合、互操作性等特点,被广泛应用于各类系统集成和业务应用中。
而webservice客户端调用作为web服务的重要组成部分,关系到系统之间的数据交换和业务协同,因此在实际应用中具有重要意义。
二、webservice客户端调用概述webservice客户端调用是指一个系统(客户端)通过webservice协议向另一个系统(服务端)发送请求并接收响应的过程。
在实际应用中,一般包括以下几个步骤:1. WSDL文件分析与理解客户端需要获取服务端的WSDL文件,该文件描述了服务端所提供的服务及其相关信息。
客户端需要对WSDL文件进行分析与理解,以便了解如何构造请求消息和解析响应消息。
2. 构造请求消息在了解了WSDL文件后,客户端需要按照约定的消息格式,构造相应的请求消息。
这包括消息的头部、消息体等内容,通常需要使用SOAP协议进行消息封装和传输。
3. 发送请求并接收响应客户端发送构造好的请求消息到服务端,等待服务端的响应。
在这个过程中,客户端需要注意错误处理、超时设置等问题,以保证通信的可靠性和稳定性。
4. 解析响应消息客户端需要对服务端返回的响应消息进行解析,提取所需的数据并进行相应的处理。
这一过程通常涉及到XML解析、数据转换等操作。
以上过程简要描述了webservice客户端调用的基本流程,但实际情况下可能还会涉及到安全认证、日志记录、性能优化等问题。
三、webservice客户端调用例子为了更好地理解webservice客户端调用的过程,我们以一个具体的例子来说明。
假设我们有一个名为"StockService"的web服务,提供了查询股票信息的功能,我们希望通过一个客户端程序来调用该服务并获取股票信息。
1. 分析WSDL文件我们需要获取StockService的WSDL文件,并对其进行分析。
Delphi调用webservice总结2011-12-06 12:44:45| 分类:delphi |字号订阅Delphi调用C#写的webservice用delphi的THTTPRIO控件调用了c#写的webservice。
下面是我调试时遇到的一些问题:1:导入wsdl文件:file--new----other----webservice---WSDLimporter---输入wsdl地址:如下:http://127.0.0.1/ WebService/WebServiceCall.asmx?wsdl注意末尾的:'?wsdl'不能少。
要不可能会说找不到。
2:设置THTTPRIO控件的属性:把http:// 127.0.0.1 /WebService/WebServiceCall.asmx?wsdl赋给URL属性,而不是赋给wsdlLocation属性。
3:传递参数是web服务端总为空:在导入的接口单元的声明部分添加如下代码:InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap),ioDocument);//其中红色部分为导入接口名称。
在IIS中配置C#写的webservice,有时候会出现如下的错误:--------------------------------------------------------分析器错误消息: 在应用程序级别之外使用注册为allowDefinition='MachineToApplication' 的节是错误的。
如果在IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。
源错误:安全身份验证模式。
--><authentication mode="Windows"/><!--如果在执行请求的过程中出现未处理的错误------------------------------------------------------------------------------解决方法:在要发布的虚拟目录中的创建一个应用程序。
java用XFire开发调用webService例子XFire 概述XFire 是codeHaus 组织提供的一个开源框架,它构建了POJO 和SOA 之间的桥梁,主要特性就是支持将POJO 通过非常简单的方式发布成Web 服务,这种处理方式不仅充分发挥了POJO 的作用,简化了Java 应用转化为Web 服务的步骤和过程,也直接降低了SOA 的实现难度,为企业转向SOA 架构提供了一种简单可行的方式。
XFire 目前最新的版本是1.2.2,目前支持的特性主要包括:支持将Web 服务绑定到POJO、XMLBeans、JAXB1.1、JAXB2.0 和Castor;支持基于HTTP、JMS、XMPP 等多种协议访问Web 服务;支持多种Web 服务业界重要标准如SOAP、WSDL、Web 服务寻址(WS-Addressing)、Web 服务安全(WS-Security)等;支持JSR181,可以通过JDK5 配置Web 服务;高性能的SOAP 实现;服务器端、客户端代码辅助生成;对Spring、Pico、Plexus 等项目的支持等。
XFire 安装包XFire 框架目前的最新版本是1.2.6,可以访问 下载XFire 框架的安装包,下载时请选择“全部二进制发布包(Binary Distribution in zip package)”,而不仅仅是“XFire jar 文件(Jar of all XFire modules)”。
下载完成后,我们可以将下载的.zip 文件解压缩到任意的文件夹中(后面的章节中使用% XFIRE_HOME % 表示XFire 框架的安装目录),解压缩后形成的文件目录结构如下:api(目录)api 目录中是XFire 框架中所有类(class)对应的API 文档,为开发者使用XFire 完成应用开发提供帮助。
examples(目录)examples 目录中包含了所有随XFire 二进制包发布的实例,包括这些实例的源代码和相关Web 应用配置内容。
1.新建一個delphi工程,file->new->other->WebServices選項卡->WSDLImporter->填入URL:http://localhost:3408/WebSite3/Service.asmx?wsdl 紅色標註部分是添加上去的,不能少,然後點擊NEXT->FINISH完成。
至此多了個Service1的unit2.在Service1這個unit的initialization下添加如下代碼:InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap),ioDocument);紅色部分是webservice提供的接口名稱。
3.在新建的工程文件unit1中uses Service14.添加控件button1,HTTPRIO1,設置URL屬性為:http://localhost:3408/WebSite3/Service.asmx?wsdl5.在button1的click事件中添加代碼如下:procedure TForm1.Button1Click(Sender: TObject);varWII:ServiceSoap;v_ret:double;beginWII := Service1.GetServiceSoap(true,'',HTTPRIO1);v_ret := WII.addition(2,3);showmessage(floattostr(v_ret));end;補充:service1的代碼如下unit Service1;interfaceuses 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.//********************************************************************* *** //// !:double - "/2001/XMLSchema"//********************************************************************* *** //// Namespace : /// soapAction: /%operationName%// transport : /soap/http// binding : ServiceSoap// service : Service// port : ServiceSoap// URL : http://localhost:3408/WebSite3/Service.asmx//********************************************************************* *** //ServiceSoap = interface(IInvokable)['{77573149-9C57-FA51-F11F-EFD527C91BD9}']function addition(const i: Double; const j: Double): Double; stdcall;function substract(const i: Double; const j: Double): Double; stdcall;function multiplication(const i: Double; const j: Double): Double; stdcall;function division(const i: Double; const j: Double): Double; stdcall;end;function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ServiceSoap;implementationfunction GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;constdefWSDL = 'http://localhost:3408/WebSite3/Service.asmx?wsdl';defURL = 'http://localhost:3408/WebSite3/Service.asmx';defSvc = 'Service';defPrt = 'ServiceSoap';varRIO: THTTPRIO;beginResult := nil;if (Addr = '') thenbeginif UseWSDL thenAddr := defWSDLelseAddr := defURL;end;if HTTPRIO = nil thenRIO := THTTPRIO.Create(nil)elseRIO := HTTPRIO;tryResult := (RIO as ServiceSoap);if UseWSDL thenbeginRIO.WSDLLocation := Addr;RIO.Service := defSvc;RIO.Port := defPrt;end elseRIO.URL := Addr;finallyif (Result = nil) and (HTTPRIO = nil) thenRIO.Free;end;end;initializationInvRegistry.RegisterInterface(TypeInfo(ServiceSoap), '/', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap),'/%operationName%');InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap),ioDocument);end.。
使用WebService调用方式的具体代码会依赖于你所使用的编程语言和框架。
以下是一个简单的例子,演示了在Python中使用zeep库进行基本的WebService 调用:
首先,你需要安装zeep库,你可以使用以下命令:
pip install zeep
然后,可以使用以下Python代码调用WebService:
from zeep import Client
# WebService的WSDL地址
wsdl_url = 'xxxx'
# 创建WebService客户端
client = Client(wsdl_url)
# 调用WebService方法
result = client.service.YourWebServiceMethod(parameter1='value1', parameter 2='value2')
# 处理结果
print(result)
在这个例子中,你需要替换xxxx地址为你实际的WebService WSDL 地址,以及YourWebServiceMethod为你要调用的具体WebService方法。
还需要提供相应的参数。
请注意,不同的编程语言和库可能有不同的方式来调用WebService。
在.N ET 中,你可以使用ServiceReference或WebReference 来生成WebService 客户端。
在Java中,你可以使用JAX-WS或Apache CXF。
在Node.js中,你可以使用soap 或其他相关库。
上述示例提供了一个基本的概念,具体的实现可能会因为所用语言和框架而有所不同。
一、delphi开发WebService1、打开delphi,选择New--other--WebService,在右侧选择SOAP Server Application,点击OK2、上一步点击OK后,会出现一个提示窗口,这里选择ISAPI 动态链接库,点击OK进入下一步3、此时会提示一个确认窗口,询问是否为SOAP模块创建接口,这样要选择YES,delphi会为您自动创建一个接口,否则自己动手写会很麻烦4、点击YES后,delphi会提示你输入接口服务名称,这个名称在后面就是接口名和实现此接口的类名,这里我们键入MyTest,其他选项不要动,点击 OK5、点OK后,delphi会自动创建两个单元,一个是MyTestIntf接口单元,一个是MyTestImpl接口实现单元6、在MyTestIntf接口单元里面,接口声明后面写入你的接口函数,这个函数就是后面给别人调用实现一定功能的函数。
注意:函数声明后面一定要加上stdcall约束参数传入方式,否则其他语言可能无法调用此接口函数7、切换到MyTestImpl接口实现单元,发现delphi已经为我们创建好了接口实现类TMyTest,在类的声明里面写上刚才的接口函数。
当然也可以写入其他函数供你的接口函数内部调用,这里我重新构造了类的Create函数及析构函数8、保存项目,编译生成DLL文件,此时delphi编写WebService 就完成了,如此简单配置IIS后,部署程序。
打开IIS,找到虚拟目录,浏览那个程序。
1.点击IMyTest后面的WSDL,会出现如下界面。
这是一个XML文档,描述WSDL的细节,浏览器地址栏中的地址是我们需要的,复制下来2.返回delphi,新建一个VCL项目。
接着选择New--other--WebService,选择WSDL importer,点击OK3.出现一个提示窗口,键入第7步得到的WSDL网址,如果WebService不在本机,注意IP地址要修改10、4点击NEXT ---NEXT--OK,delphi会自动引入一个单元,这个单元就是WebService的接口单元,里面会自动生成一个Get开头方法。
SIEBEL开发实例——SIEBEL调用WEBSERVICE接口1.生成wsdl文件在网址栏输入http://192.168.20.80:8082/SSERP/services/ErpService?wsdl另存为wsdl文件2.导入wsdl文件导入之前要在tools.cfg文件中指定导入盘符,代码如下:[EAIFileTransportConfigSubsys]EAIFileTransportFolders = G:\会在wsdl的目录下生成一个xml文件在BS中查找导入的service名称为wsdl文件名称导入后会生成IO,如果要重新导入需要删除对应的IO3、调用webservice代码实例:function create_acct(Inputs, Outputs){var erpsvc = TheApplication().GetService("IErpService"); var acctBO = TheApplication().GetBusObject("Account"); var acctBC = acctBO.GetBusComp("Account");var acctPara = TheApplication().NewPropertySet();var createErpAcctList = TheApplication().NewPropertySet(); var createErpAcct = TheApplication().NewPropertySet(); var acctInputs = TheApplication().NewPropertySet();var acctOutputs = TheApplication().NewPropertySet();try{var row_id = Inputs.GetProperty("row_id");acctBC.ClearToQuery();acctBC.SetViewMode(AllView);acctBC.ActivateField("SHFM Par Accnt Id");acctBC.ActivateField("SHFM Par Accnt Name");acctBC.ActivateField("CSN");acctBC.ActivateField("Name");acctBC.ActivateField("Account Type Code");acctBC.ActivateField("Rule Attribute 2");acctBC.ActivateField("StockDistriFlag");acctBC.ActivateField("Household Location");acctBC.ActivateField("Primary Organization Id");acctBC.ActivateField("Self Shipment Flag");acctBC.ActivateField("Dont Share");acctBC.ActivateField("Primary Ship To Address Id");acctBC.ActivateField("Print by Tax Rate Flag");acctBC.ActivateField("Sales Rep Id");acctBC.ActivateField("Primary Ship To Address Id");acctBC.ActivateField("SHFM Par Accnt Id");acctBC.ActivateField("SY Salesrep Contact Id");acctBC.ActivateField("Print at Min Unit Flag");acctBC.ActivateField("Product Line");acctBC.ActivateField("SY Sub AccChannel Type");acctBC.ActivateField("Account Status Change Reason");acctBC.ActivateField("Order Flag");acctBC.SetSearchSpec("Id", row_id);acctBC.ExecuteQuery(ForwardOnly);acctPara.SetType("createErpAcct:parameters");createErpAcctList.SetType("ListOfcreateErpAcct");createErpAcct.SetType("createErpAcct");if (acctBC.FirstRecord()){createErpAcct.SetProperty("arg0", acctBC.GetFieldValue("SHFM Par Accnt Id")); createErpAcct.SetProperty("arg1", acctBC.GetFieldValue("SHFM Par Accnt Name")); createErpAcct.SetProperty("arg2", acctBC.GetFieldValue("CSN")); createErpAcct.SetProperty("arg3", acctBC.GetFieldValue("Id")); createErpAcct.SetProperty("arg4", acctBC.GetFieldValue("Name"));var org_id = acctBC.GetFieldValue("Primary Organization Id");var orgBO = TheApplication().GetBusObject("Organizations");var orgBC = orgBO.GetBusComp("Organization");orgBC.ClearToQuery();orgBC.SetViewMode(AllView);orgBC.ActivateField("ERP OU Id");orgBC.SetSearchSpec("Id", org_id);orgBC.ExecuteQuery(ForwardOnly);if (orgBC.FirstRecord()){createErpAcct.SetProperty("arg5", orgBC.GetFieldValue("ERP OU Id"));} else {createErpAcct.SetProperty("arg5", null);}createErpAcct.SetProperty("arg6", acctBC.GetFieldValue("Account Type Code"));createErpAcct.SetProperty("arg7", acctBC.GetFieldValue("Rule Attribute 2"));createErpAcct.SetProperty("arg8", acctBC.GetFieldValue("StockDistriFlag"));createErpAcct.SetProperty("arg9", acctBC.GetFieldValue("Print by Tax Rate Flag"));createErpAcct.SetProperty("arg10", acctBC.GetFieldValue("Self Shipment Flag"));createErpAcct.SetProperty("arg11", acctBC.GetFieldValue("SY Salesrep Contact Id"));var ship_id = acctBC.GetFieldValue("Primary Ship To Address Id");var addressBC = acctBO.GetBusComp("SY Ship To Address");addressBC.ClearToQuery();addressBC.SetViewMode(AllView);addressBC.ActivateField("Integration Id");addressBC.ActivateField("Integration Id 2");addressBC.ActivateField("Integration Id 3");addressBC.ActivateField("Street Address");addressBC.ActivateField("Landlord Name");addressBC.ActivateField("Landlord Phone Number");addressBC.SetSearchSpec("Id", ship_id);addressBC.ExecuteQuery(ForwardOnly);if (addressBC.FirstRecord()){createErpAcct.SetProperty("arg12", addressBC.GetFieldValue("Integration Id"));createErpAcct.SetProperty("arg13", addressBC.GetFieldValue("Integration Id 2"));createErpAcct.SetProperty("arg14", addressBC.GetFieldValue("Integration Id 3"));createErpAcct.SetProperty("arg15", addressBC.GetFieldValue("Street Address"));createErpAcct.SetProperty("arg18", addressBC.GetFieldValue("Landlord Name"));createErpAcct.SetProperty("arg19", addressBC.GetFieldValue("Landlord Phone Number"));} else {createErpAcct.SetProperty("arg12", null);createErpAcct.SetProperty("arg13", null);createErpAcct.SetProperty("arg14", null);createErpAcct.SetProperty("arg15", null);createErpAcct.SetProperty("arg18", null);createErpAcct.SetProperty("arg19", null);}var organizationBO = TheApplication().GetBusObject("List Of Values");var organizationBC = organizationBO.GetBusComp("List Of Values");organizationBC.ClearToQuery();organizationBC.SetViewMode(AllView);organizationBC.ActivateField("Name");organizationBC.SetSearchSpec("Type", "RESID_LOCATION");organizationBC.SetSearchSpec("Value", acctBC.GetFieldValue("Household Location"));organizationBC.ExecuteQuery(ForwardOnly);if (organizationBC.FirstRecord()){createErpAcct.SetProperty("arg16", organizationBC.GetFieldValue("Name"));} else {createErpAcct.SetProperty("arg16", null);}createErpAcct.SetProperty("arg17", acctBC.GetFieldValue("SHFM Par Accnt Id"));createErpAcct.SetProperty("arg20", acctBC.GetFieldValue("Dont Share"));createErpAcct.SetProperty("arg21", acctBC.GetFieldValue("Print at Min Unit Flag"));createErpAcct.SetProperty("arg22", acctBC.GetFieldValue("Product Line"));createErpAcct.SetProperty("arg23", acctBC.GetFieldValue("SY Sub AccChannel Type"));createErpAcct.SetProperty("arg24", acctBC.GetFieldValue("Account Status Change Reason"));createErpAcct.SetProperty("arg25", acctBC.GetFieldValue("Order Flag"));} else {createErpAcct.SetProperty("arg0", null);createErpAcct.SetProperty("arg1", null);createErpAcct.SetProperty("arg2", null);createErpAcct.SetProperty("arg3", null);createErpAcct.SetProperty("arg4", null);createErpAcct.SetProperty("arg5", null);createErpAcct.SetProperty("arg6", null);createErpAcct.SetProperty("arg7", null);createErpAcct.SetProperty("arg8", null);createErpAcct.SetProperty("arg9", null);createErpAcct.SetProperty("arg10", null);createErpAcct.SetProperty("arg11", null);createErpAcct.SetProperty("arg12", null);createErpAcct.SetProperty("arg13", null);createErpAcct.SetProperty("arg14", null);createErpAcct.SetProperty("arg15", null);createErpAcct.SetProperty("arg16", null);createErpAcct.SetProperty("arg17", null);createErpAcct.SetProperty("arg18", null);createErpAcct.SetProperty("arg19", null);createErpAcct.SetProperty("arg20", null);createErpAcct.SetProperty("arg21", null);createErpAcct.SetProperty("arg22", null);createErpAcct.SetProperty("arg23", null);createErpAcct.SetProperty("arg24", null);createErpAcct.SetProperty("arg25", null);}createErpAcctList.AddChild(createErpAcct);acctPara.AddChild(createErpAcctList);acctInputs.AddChild(acctPara);erpsvc.InvokeMethod("createErpAcct", acctInputs, acctOutputs);if (acctOutputs.GetChildCount() > 0){var outputPara = acctOutputs.GetChild(0);if (outputPara.GetType() == "createErpAcctResponse:parameters"){if(outputPara.GetChildCount() > 0){var outputcreateErpAcctList = outputPara.GetChild(0);if (outputcreateErpAcctList.GetType() == "ListOfcreateErpAcctResponse") {if (outputcreateErpAcctList.GetChildCount() > 0){var outputcreateErpAcct = outputcreateErpAcctList.GetChild(0);if (outputcreateErpAcct.GetType() == "createErpAcctResponse") {var returnValue = outputcreateErpAcct.GetProperty("return");var returnFlag = returnValue.substr(0,1);var returnMsg = returnValue.substr(1);Outputs.SetProperty("returnFlag", returnFlag);Outputs.SetProperty("returnMsg", returnMsg);}}}}}}}catch(e){TheApplication().RaiseErrorText(e);}}4.在client端导入xml文件SIEBEL->管理WEB服务->出站WEB服务点击导入。
Delphi调用webs ervic e 经典实例Dispat ch: 派遣,分派 Invoke: 调用 Invoka ble: 可调用接口TReomt able: WebSer vice中自定义类都是继承自该类 TSOAPA ttach ment: Attach ment:附件,一种流类型,可以返回流数据 CGI:(EXE)ISAPI:(DLL) Base64编码: uses EncdDe cd; s := Encode Strin g(s); //加 base64编码 s := Decode Strin g( str ); //解码 UTF8: UTF8 是8位的UN ICODE字符,而ASCII是7位 ,gb2312和unic ode是2字节/字,utf8是3字节/字utf8类似以前的8位转7位的编码,是为了在网络间不同系统的通讯方便而作的转换。
几乎所有用.Net写的W ebSer vice只支持DOC方式、Delphi写的只支持RPC方式;J2ME目前对WebServic e的支持仅限于RFC172,而 RFC172要求必须为DOC方式(sun怎么偏袒MS?)!为了在设计中减少障碍,下面还介绍几个概念。
1) SOAP:SOAP是一种简单有效的数据传输协议,用于分布式网络环境下数据信息交换,它以XML作为数据传输的格式,搭配Inte rnet上标准的传输协议HTT P、SMTP、TCP等来传送信息。
从本质上看,SOAP事实上只是将R eques t和Respon se经由X ML格式把数据打包,达到双方沟通的目的。
2) WSDL:WSDL(Web Servic e Descri ption Langua ge)是一种以XM L格式描述的WebServic e语言,当Web Servic e Provid er 要对外公布提供的 Web Servic e,就需要通过W SDL来构建描述语言。
delphi调用webservice服务我用delphi的THTTPRIO控件调用了c#写的webservice。
下面是我调试时遇到的一些问题:1,导入wsdl文件:file--new----other----wenservice---WSDLimporter---输入wsdl地址:如下:注意末尾的:'?wsdl'不能少。
要不可能会说找不到。
2,设置THTTPRIO控件的属性:开始把赋给了wsdlLocation属性。
连接时总是报错。
后来赋给URL属性,就不报错了。
3,传递参数是web服务端总为空:在导入的接口单元的声明部分添加如下代码:InvRegistry.RegisterInvokeOptions(TypeInfo(WebServiceCall Soap),ioDocument);//其中红色部分为导入接口名称。
下面是客户端的简单代码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, InvokeRegistry, StdCtrls, Rio, SOAPHTTPClient,WebServiceCall;typeTForm1 = class(TForm)htpr1: THTTPRIO;edt1: TEdit;btn1: TButton;procedure btn1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);vars:WideString;begins:='打分得分';edt1.Text:=(htpr1 as WebServiceCallSoap).OperaterLogin('1','dd',s);//operaterLogin 为接口方法。
Delphi 调用webservice 经典实例Dispatch: 派遣,分派 Invoke: 调用 Invokable: 可调用接口TReomtable: WebService中自定义类都是继承自该类 TSOAPAttachment: Attachment:附件,一种流类型,可以返回流数据 CGI:(EXE)ISAPI:(DLL) Base64编码: uses EncdDecd; s := EncodeString(s); //加 base64 编码 s := DecodeString( str ); //解码 UTF8: UTF8 是8位的UNICODE字符,而ASCII是7位 ,gb2312和unicode是2字节/字,utf8是3字节/字utf8类似以前的8位转7位的编码,是为了在网络间不同系统的通讯方便而作的转换。
几乎所有用.Net写的WebService只支持DOC方式、Delphi写的只支持RPC方式;J2ME目前对Web Service的支持仅限于RFC172,而 RFC172要求必须为DOC方式(sun怎么偏袒MS?)!为了在设计中减少障碍,下面还介绍几个概念。
1) SOAP:SOAP是一种简单有效的数据传输协议,用于分布式网络环境下数据信息交换,它以XML 作为数据传输的格式,搭配Internet上标准的传输协议HTTP、SMTP、TCP等来传送信息。
从本质上看,SOAP事实上只是将Request和Response经由XML格式把数据打包,达到双方沟通的目的。
2) WSDL:WSDL(Web Service Description Language)是一种以XML格式描述的Web Service语言,当Web Service Provider 要对外公布提供的 Web Service,就需要通过WSDL来构建描述语言。
在WSDL中有两个非常重要的要素::此WSDL文件所要描述的Web Service集合;每一个Port代表外界Client可以和此Service沟通的一个进入点,一个Port会指定一个Binding方式。
3):处理中文乱码的问题: 将HttpRio的 Converter 的 Options 的soUTF8InHeader 设为 True 将生成soap消息的HTTPSoapDispatcher控件,添加encoding为gb2312 eUTF8InHeader := True;4)在Delphi中,能够传递的自定义类型的对象要继承TRemotable,5:修正一个服务器端的一个Bug:将ISAPIThreadPool和ISAPIApp的次序变一下:ISAPIApp必须在 ISAPIThreadPool之前: uses ... ISAPIApp, ISAPIThreadPool 解决如下错误: Received content of invalid Content-Type setting:text/html -SOAP"expects"text/xml" 6:"XML document must have a top level element. Line: 0" 错误,我该如何解决??哈纳斯 (2002-08-05 17:26:00) 我也曾碰到同样的问题解决方法是:别设httprio的wsdllocation,设它的url 如http://localhost/mydir/project1.exe/wsdl/IFIRST mydir是你的可执行的虚拟目录,IFIRST是你定义的接口名********************************************************************* **************************Delphi中WebService包含的组件解释(有7个)(1) THTTPRIO-------:使用Http消息来调用远程使用SOAP的接口对象(2) THTTPReqResp---:给服务器发送一个SOAP消息, THTTPReqResp在可调用接口上执行一个方法请求.(3) TOPToSoapDomConvert ----:TOPToSoapDomConvert处理Soap方法请求的组合与分发(4) TSoapConnection:TSoapConnection在客户端的多层数据库应用中创建并维护客户端和作为WebService 的远程应用服务器间的连接(5) THTTPSoapDispatcher -----:通过将Soap消息转发给调用者,THTTPSoapDispatcher对Soap消息做出响应.(6) TWSDLHTMLPublish -----:TWSDLHTMLPublish发布描叙webService应用的Wsdl文档(7) THTTPSoapPascalInvoker -----:THTTPSoapPascalInvoker解释Soap 的请求信息,并执行相应的可调用接口.********************************************************************* **************************WSDL 说明:(Web Services Description Language) 规范是一个描述接口,语义以及Web 服务为了响应请求需要经常处理的工作的XML文档。
这将使简单地服务方便,快速地被描述和记录。
以下是一个WSDL的样例:first service它包含了以下的关键信息:消息的描述和格式定义可以通过XML文档中的和标记来传送。
标记中表示了消息传送机制。
(e.g. request-only,request-response, response-only) 。
标记指定了编码的规范。
标记中表示服务所处的位置 (URL)。
WSDL在UDDI中总是作为一个接口描述文档。
因为UDDI是一个通用的用来注册WSDL规范的地方,UDDI的规范并不限制任何类型或者格式描述文档。
这些文档可能是一个WSDL文档,或者是一个正规的包含导向文档的Web页面,也可能只是一个包含联系信息的电子邮件地址。
现在Java提供了一个 Java API for WSDL (JWSDL)规范。
它提供了一套能快速处理WSDL文档的方法,并且不用直接对XML文档进行操作,它会比 JAXP更方便,更快速。
********************************************************************* **************************SOAP说明(Simple Object Access Protocal)。
我们先简单了解WebServices运作模式。
服务端生成服务描述文件WSDL(Web Services Description Language,类似COM的Interface Description Language),如果接收客户端的SOAP请求消息(XML格式数据),解析其调用和参数,根据WSDL和WSML(Web Services Meta Language,Microsoft为描述WSDL里提供的方法与实现该方法的COM对象之间的映射关系而特地设立),调用相应COM对象完成指定功能,并返回到SOAP 消息遣至用户;客户端取得并解析服务端的服务描述文件从而得知服务端的服务内容及调用方式,生成SOAP请求消息(指定调用的方法名称和参数)送往服务端。
********************************************************************* **************************TReomtable说明: WebService中自定义类都是继承自该类 //自己定义一个继承自TRemotable的类 (注意只有属性定义,没有方法) TSpeciesInfo =class(TRemotable) private FLength: Integer; FSpeciesName: string; FCategory: string; FCommonName: string; FmoreInfo: string; published property Category: string read FCategory write FCategory; property CommonName: string read FCommonName write FCommonName; property SpeciesName: string read FSpeciesName write FSpeciesName; property Length: Integer read FLength write FLength; property MoreInfo: string read FmoreInfo write FMoreInfo; end;TSOAPAttachment说明:一种Soap的流类型数据.跟平时的integer等等一个意思 //比如(1):服务器端建立一个流输出(result:)GrapStream:=TMemoryStream.create; trySoapAttachment:=TSoapAttachment.create;TBolbField(frmdm.adoqury.fields[0]).SaveToStream(GrapStream); SoapAttachment.SetSourceStream(GraphStream,soReference);result:=SoapAttachment; except if assigned(GrapStream) then GrapStream.free; if assigned(SoapAttchament) then SoapAttchment.free; end(2):客户端接受一个流输入 var src:string; begin if notAssigned(SoapAttachment) then exit; Src:=SoapAttachment.CacheFile; ....例子,基于Soap和webService的分布式网络程序实例//编写服务器端 --ok1:File --->New---->Other----->WebService--->Soap WebService Application 后生成3个组件一个是调用者组件:THTTPSoapPascalInvoker:完成Soap消息和.... 一个是调度者组件:THTTPSoapDispatcher:自动响应送入的soap消息,并且把他们传递给调用者,可以使用他的 WebDispatch属性来识别应用程序响应的http请求.包括设置PathInfo属性来指明指向应用程序的任何URL的路径部分,设置MethodType属性来指明请求消息的方法头. 一个是WSDL发布者:TWSDLHTMLPublisher:WSDL发布者发布描叙接口以及如何调用他们的wsdl文档,使用非delphi 编写的客户端程序也可以调用WebService应用程序.2:在接口中添加方法和在实现该接口的类中实现该方法. (1):接口中自定义的类都是继承自TRemotable类,该类只能有属性,没有方法 (2):3:将生成的Dll文件拷贝到 C:\InetPub\Scripts目录下面.//编写客户端 --ok(1):File--->New--->other---->WebSerice--->Wsdl Importer: 对话框1:WsDl Source:输入==>http://服务器名/scripts/应用程序名/wsdl/相应接口 ,然后Next下步.然后点finish(2):添加一个普通的窗体,上面放WebService中的控件:HTTPRIO,编写它的OnAfterExecute ,OnBeforeExecute事件连接服务:http://server/script/MyWebService.dll/Soap/ImyWeb ***请注意是Soap/接口 FAttachService为WebService的接口 if FAttachService = nil then begin FAttachService := GetiMyWeb(False, EditUrl.Text); (FAttachService as IRIOAccess).RIO.OnBeforeExecute := HTTPRIO1BeforeExecute; (FAttachService as IRIOAccess).RIO.OnAfterExecute :=HTTPRIO1AfterExecute; end; Result := FAttachService;********************************************************************* ********** (HTTPRIO1 as ITest).TestFunction(aParam, bParam);(3):注意在IIS中设置Script的是否有执行权限.编写一个基于Soap DataModule的三层数据库应用服务器端:建立一个Web App Debugger executable类型,不需要接口,添加一个Soap Data Module,放上AdoCon,AdoDataSet,DataSetProvider1 设置数据好连接,利用AdoDataSet打开一个数据集,然后编译运行,打开Web App Debugger查看是否正确.客户端:(1)建立一个普通的应用程序,添加SoapConnection1组件,设置他的url:格式为:http://localhost:1024/Demo3.wadSoapDemo3/soap(2)添加一个ClientDataSet 设置它的RemoteServer=SoapConnection1,provideName=DataSetProvider1 (注意将Web App Debugger打开) (3)Active就可以看到数据了.WebService的服务器端的调试(1):编写服务器时选择:Web App Debugger executable类型(2):编写完成后运行一次服务器,则系统将把该webservice的类注册(3):启动Tool--->Web App Debugger,设置servers的optionsport============1024 defaulturl=====http://localhost:1024/Demo3.wadSoapDemo3/wsdl 其中demo3为exe 程序的名字, wadSoapDemo3为建立服务器的时候填写的类名称,可在主Form的initialization中找到:TWebAppSockObjectFactory.Create('wadSoapDemo3')(4)打开ie,在地址输入:http://localhost:1024/Demo3.wadSoapDemo3/wsdl就可以查看接口了Server 端:SoapDataModule中加入 ADOConnection1、ADODataSet1、DataSetProvider1;DataSetProvider1的DataSet设置为 ADODataSet1;ADODataSet1的CommandText设置为空,Connection设置为ADOConnection1。