Delphi SOAP WebService 服务器端多个 SoapDataModule 的做法

Delphi中Web服务的舞蹈:SOAP与RESTful的交响诗 通过本文的探索,我们了解了Delphi中SOAP和RESTful Web服务客户端的实现方法。SOAP以其结构化和协议性在企业级应用中占据重要地位,而RESTful则以其简洁和灵活性在现代Web应用中广受欢迎。掌握这两种技术,将使你在Delphi开发中更加游刃有余。 阅读详情

以下描述的实验结果,在 Delphi 10.3.3 社区版上测试通过。

前情提要:Delphi 写 WebService 架构的三层程序如何维护 Session

 

简述:

用 Delphi 实现 WebService 服务器端,客户端也使用 Delphi 来开发。

服务器端,可以用 TSoapDataModule 在设计期,可视化地拖放数据库控件,连接数据库,从数据库获取数据,并通过 TDataSetProvider 输出给客户端。在客户端,则可以在服务器运行的情况下,使用 TSoapConnection 去连接我们开发的 WebService 服务器,使用 TClientDataSet 去直接从服务器端的 TDataSetProvider 获取数据,或者提交数据。

在上述架构下,基本上不写程序,设计期拖拉控件,就能建立 WebService 的服务器端和客户端,并且客户端可以获得数据库的数据,编辑后提交到服务器端,最终通过服务器端提交到数据库服务器。

在上述架构下,如果有一些业务逻辑需要控制,可以在服务器端的 TSoapDataModule 里面的 TDataSetProvider 的事件里面,自己写代码,控制客户端可以获得的数据和可以提交的数据。

问题:

如果程序复杂了,代码非常多,全部写在服务器端的一个 TSoapDataModule 里面,代码的组织和管理就成了问题。这时候需要模块化,比如,用多个 TSoapDataModule 来模块化服务器端的业务逻辑代码。

问题是,当服务器端有多个 TSoapDataModule 的时候,客户端采用什么方式,可以定位要访问的 SoapDataModule ?

 

解决方法:

以下是我写的测试程序的描述:

首先,服务器端有一个 SoapDataModule,定义如下:

  ItestSoap = interface(IAppServerSOAP)
    ['{A992AB93-6455-4B0E-A35F-5C7FFBFD4EA3}']
    procedure SaveDataSet(ADeltas: Variant); stdcall;
  end;

  TtestSoap = class(TSoapDataModule, ItestSoap, IAppServerSOAP, IAppServer)

这个是服务器里面的第一个。在只有一个的情况下,客户端的 SoapConnection1 在设计期默认的 SoapServerIID 为:
IAppServerSOAP - {C99F4735-D6D2-495C-8CA2-E53E5A439E61}

URL 为:SoapConnection1.URL := 'http://localhost:8080/soap';

到这里,一切正常,设计期客户端拖过来的 TClientDataSet 是可以看到服务器端的 DataSetProvider 的,设置好以后,设计期就可以在客户端打开 ClientDataSet。这也是 Delphi 开发 Soap WebService 的基本方式。

接下来,我们在服务器端再增加一个 SoapDataModule:

  IsoapDataModule2 = interface(IAppServerSOAP)
    ['{52B5735F-378C-427E-8590-19C4704FAC94}']
    function Hello: string; stdcall;
  end;

  TsoapDataModule2 = class(TSoapDataModule, IsoapDataModule2, IAppServerSOAP, IAppServer)

Delphi 帮我们自动创建的代码框架,这里的 IsoapDataModule2 有一个 ISoapDataModule2 接口,它有一个接口 IID:['{52B5735F-378C-427E-8590-19C4704FAC94}']

服务器运行起来后,客户端做一个 Import WSDL 的操作,在客户端创建 IsoapDataModule2 对应的客户端声明文件。这个操作的 URL 是:http://127.0.0.1:8080/wsdl/IsoapDataModule2

客户端创建了接口声明文件,保存为 IsoapDataModule21.pas ,代码如下:

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://127.0.0.1:8080/wsdl/IsoapDataModule2
//  >Import : http://127.0.0.1:8080/wsdl/IsoapDataModule2>0
// Codegen  : [wfMapArraysToClasses+, wfAllowOutParameters+, wfUseXSTypeForSimpleNillable+, wfCreateArrayElemTypeAlias+]
// Version  : 1.0
// (2020/11/25 23:25:25 - - $Rev: 96726 $)
// ************************************************************************ //

unit IsoapDataModule21;

interface

uses Soap.InvokeRegistry, Soap.SOAPHTTPClient, System.Types, Soap.XSBuiltIns, SOAPMidas;

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 Embarcadero 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"[Gbl]


  // ************************************************************************ //
  // Namespace : urn:UsoapDataModule2-IsoapDataModule2
  // soapAction: urn:UsoapDataModule2-IsoapDataModule2#Hello
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : rpc
  // use       : encoded
  // binding   : IsoapDataModule2binding
  // service   : IsoapDataModule2service
  // port      : IsoapDataModule2Port
  // URL       : http://127.0.0.1:8080/soap/IsoapDataModule2
  // ************************************************************************ //
  IsoapDataModule2 = interface(IAppServerSOAP)
  ['{F28A698B-98B0-DF8E-4977-6AE075489E81}']
    function  Hello: string; stdcall;
  end;



implementation
  uses System.SysUtils;

initialization
  { IsoapDataModule2 }
  InvRegistry.RegisterInterface(TypeInfo(IsoapDataModule2), 'urn:UsoapDataModule2-IsoapDataModule2', '');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IsoapDataModule2), 'urn:UsoapDataModule2-IsoapDataModule2#Hello');

end.

客户端的 SoapConnection1 的 URL 或者 SoapServerIID 在设计期无论如何设置,都无法看到第二个 SoapDataModule -- ClientDataSet 的 ProviderName 属性无法下拉看到对应的 DataSetProvider 也无法在设计期打开。但是因为 ProviderName 属性是字符串,设计期是可以手动填写进去的。但填写了,设计期也无法打开。

但是,在运行期,是可以打开的。运行期代码如下:

  //测试服务器端有多个 SoapDataModule 的情况是否可以在客户端调用
  SoapConnection1.Connected := False;
  SoapConnection1.SOAPServerIID := '{F28A698B-98B0-DF8E-4977-6AE075489E81}';
  SoapConnection1.URL := 'http://localhost:8080/soap';
  SoapConnection1.Connected := True;
  ClientDataSet3.Open;

上述代码,其实就是设置了 SOAPServerIID 为第二个 SoapDataModule 里面声明的接口的 GUID;

当然,设置了 SOAPServerIID 后,要打开对应第一个模块的 ClientDataSet 就不行了。因此,打开之前要设置回默认的那个 ID:

  SoapConnection1.Connected := False;
  SoapConnection1.SOAPServerIID := '{C99F4735-D6D2-495C-8CA2-E53E5A439E61}';
  SoapConnection1.URL := 'http://localhost:8080/soap';
  SoapConnection1.Connected := True;

  ClientDataSet1.Close;
  ClientDataSet2.Close;

  ClientDataSet1.Open;
  ClientDataSet2.Open;

上述代码中的 SOAPServerIID 是设计期 SoapConnection1 的默认值。也就是 IAppServerSOAP - {C99F4735-D6D2-495C-8CA2-E53E5A439E61}  --  这个字符串在设计期,拖到界面上的 SoapConnection1 的属性面板里面能看到。

到这里,一切正常。

其实,上述代码中,对 SOAPServerIID 的设置,也可以不采用默认值,而是采用该服务器端数据模块的接口 ITestSoap 的 IID。

 

需要注意的问题:

第二个 SoapDataModule 的接口,一定要有一个方法,而不能是空的。如果是空的,客户端在执行 Import 的 WSDL 接口声明文件 IsoapDataModule21.pas 里面,正常的是这样的:

InvRegistry.RegisterInterface(TypeInfo(IsoapDataModule2), 'urn:UsoapDataModule2-IsoapDataModule2', '');

但是,如果是空的,会是这样的:

InvRegistry.RegisterInterface(TypeInfo(IsoapDataModule2), 'http://tempuri.org/', '');

如果是上述的不正常的声明,则前面说的调用会失败。

但是,我修改服务器端代码,把第二个 SoapDataModule 里面的接口方法 function Hello: string; stdcall; 去掉,再次编译运行服务器端,但这时候客户端代码不改,维持之前正确的接口代码(通过 WSDL Import 的方式获得),执行结果没问题。

因此,客户端通过 Import WSDL 获得的对应服务器端第二个 SoapDataModule 的接口的声明的代码,如果服务器端的接口是空的,没有函数,自动化生成的代码里面是:

InvRegistry.RegisterInterface(TypeInfo(IsoapDataModule2), 'http://tempuri.org/', '');

把上述代码手动修改为

InvRegistry.RegisterInterface(TypeInfo(IsoapDataModule2), 'urn:UsoapDataModule2-IsoapDataModule2', '');

应该是可以正常工作的。

值得注意的是:

服务器端和客户端都是 Delphi 开发的情况下,服务器端的接口声明如果是放在一个单独的文件里面,客户端可以直接引用那个文件来使用服务器端接口;也可以通过 Import WSDL 的方式,通过网络访问服务器端,自动创建出对应服务器端的接口文件。但是,通过 Import WSDL 自动创建的接口文件,其接口里面声明的 GUID 和服务器端并不一致,却能正常使用。

经过测试,在客户端,如果是采用 Import WSDL 的方式创建的对应服务器端接口的文件,其接口的 IID 和服务器端的不一样,这时候设置 SoapConnection1.SOAPServerIID 的时候采用客户端创建的接口文件里面的 GUID 是可以调用到服务器端对应的接口方法,也可以通过 ClientDataSet 直接打开获取到对应的服务器端的 SoapDataModule 里面的 DataSetProvider 的数据的。

如果客户端直接引用服务器端的接口声明文件而不是采用 WSDL 创建的文件,接口 ID 和上述不同。但将这个接口 ID 设置给 SoapConnection1.SOAPServerIID,也能正确执行所有操作。

这里,居然两种方法的接口的 IID 不同,但都能正常使用,背后是什么机理,还不清楚。

 

服务器端有多个 SoapDataModule 的时候,哪个是第一个呢?

经过测试,第一个就是服务器端的工程文件里面声明在前面的那个。工程文件代码如下:

program WebServiceServerTest;
{$APPTYPE GUI}

uses
  Vcl.Forms,
  Web.WebReq,
  IdHTTPWebBrokerBridge,
  FormUnit1 in 'FormUnit1.pas' {Form1},
  WebModuleUnit1 in 'WebModuleUnit1.pas' {WebModule1: TWebModule},
  MyTestImpl in 'MyTestImpl.pas',
  MyTestIntf in 'MyTestIntf.pas',
  //Unit2 in 'Unit2.pas' {testSoap: TSoapDataModule},
  UsoapDataModule2 in 'UsoapDataModule2.pas' {soapDataModule2: TSoapDataModule},
  Unit2 in 'Unit2.pas' {testSoap: TSoapDataModule};

{$R *.res}

begin
  if WebRequestHandler <> nil then
    WebRequestHandler.WebModuleClass := WebModuleClass;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

上述工程文件我修改过,把 UsoapDataModule2 放到 Unit2 的前面。运行服务器端以后,客户端的 ClientDataSet 下拉 ProviderName 时看到的就是 UsoapDataModule2 里面的 DataSetProvider;

结论:服务器端有多个 SoapDataModule 的时候,工程文件的 uses 里面,声明在前面那个,就是默认的第一个。

默认的第一个 SoapDataModule,在客户端的 SoapConnection.SoapServerIID 设置为默认值,就可以调用到。设计期也能看到。

 

总结:

1. 服务器端可以有多个 SoapDataModule;

2. 客户端的 SoapConnection 要访问哪个 SoapDataModule,则设置其对应的 IID;SoapConnection.URL := 'http://127.0.0.1:8080/soap';  这个 URL 不变。变的仅仅是 SoapConnection1.SOAPServerIID

3. 上述 IID 是客户端对应的服务器端 SoapDataModule 里面的接口的 IID;在客户端,这个 IID 有两种来源方式,取一种就可以了;

3.1. 服务器端运行起来,客户端通过 Delphi IDE 提供的菜单里面的 Import WSDL 菜单提供的功能,从服务器获得接口定义文档,Delphi 自动创建对应的 pas 源代码文件。这是一种方式,尤其是当服务器端是其它语言比如 JAVA 开发的时候,用 Delphi 开发客户端,需要通过这种方式获得服务器端的接口声明。上面说的 IID 就在这个接口声明文件里面。

3.2. 服务器端是 Delphi 开发的,客户端可以直接引用服务器端的接口声明文件,使用服务器端接口声明文件里面给该接口的 IID;

3.3. 这里有点奇怪的是,3.1 生成的接口声明里面的 IID 和 3.2 里面提到的服务器端的接口声明源代码的 IID 并不相同。但是,经过测试,同样有效。

 

进一步的问题:

切换访问不同的 SoapDataModule,需要客户端 SoapConnection 切换 SOAPServerIID,而切换这个 ID,必须先关闭连接,代码如下:

procedure TForm1.Button6Click(Sender: TObject);
begin
  //测试服务器端有多个 SoapDataModule 的情况是否可以在客户端调用
  SoapConnection1.Connected := False;
  SoapConnection1.SOAPServerIID := '{52B5735F-378C-427E-8590-19C4704FAC94}'; // '{C99F4735-D6D2-495C-8CA2-E53E5A439E61}'; // '{F28A698B-98B0-DF8E-4977-6AE075489E81}';
  SoapConnection1.URL := 'http://localhost:8080/soap';
  SoapConnection1.Connected := True;
  ClientDataSet3.Open;
end;

上述代码中,必须先执行 SoapConnection1.Connected := False; 否则设置 IID 无效;追踪进 SoapConnection 的源代码,设置其 Connected 属性,实际上是释放了其内部的 RIO;

如果服务器端采用 HTTP Cookie 验证客户端的登录信息,在客户端已经从服务器端获得 Cookie 的情况下,经过测试发现,执行了 SoapConnection1.Connected := False; 以后,访问服务器端,服务器端无法获得客户端的 Cookie;也就是说,客户端的 SoapConnection 没有缓存住之前拿到的 Cookie;

这个问题和 SoapConnection 无法和 HTTPRIO 共享从服务器端获得的 COOKIE 的原因可能是相同的:Cookie 没有缓存在一个统一的地方,实例之间不能共享。按照浏览器的做法,浏览器是把 Cookie 缓存到了硬盘上,浏览器下次打开,还能获得上次访问服务器获得的 Cookie;

这个问题,需要进一步研究。

当然,如果 Cookie 搞不定,客户端登录信息可以采用 URL 参数的方式,因为 SoapConnection 访问服务器端的不同模块,其 URL 是相同的。

Delphi编写soap服务器与客户端程序 Delphi编写soap服务器与客户端程序使用三层结构开发客户机、服务器软件已成为c/s系统中的主流;下面是自己在开发系统中的一些体会;本文已delphi7(windows)或kylix3(linux9)为环境描述:1、编写服务器程序      首先,看看soap服务器的建立,在delphi7中的新建栏目中,选择“ WebServices”如下图,选择“Soap Server Applicat 阅读详情

相关推荐

keil5编译时提示:keil5 target not created...如何解决?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1万+

Delphi SOAP WebService 服务器端多个 SoapDataModule 要注意的问题

本人之前有篇博客文章,讲到在 Delphi 的 Soap WebService 程序服务器端,使用多个 TSoapDataModule 的方法。文章地址在这里:https://blog.youkuaiyun.com/pcplayer/article/details/110178123内置 IdHTTPServer 的独立的 WebService 服务器端,内部有多个 TSoapDataModule,服务器端运行时,在 Delphi IDE 里面,通过 TSoapConnection 连接服务器端,ClientDataS

pcplayer的博客 2642

SoapHttpClient:用于发送SOAP消息的HttpClient包装器

SoapHttpClient HttpClient轻量级包装(使用IHttpClientFactory ),用于发布消息,使用户可以发送SOAP IHttpClientFactory和标头(如果需要)而无需关心信封。 变更日志 3.0.0 将HttpClient替换为HttpClientFactory。 2.2.1 添加了对取消令牌的支持。 2.2.0 更新的代码库。 将测试项目迁移到.net核心应用。 修复了未发送SOAPAction的错误。 2.1.0 更新到NetStandardLibrary 2.0 修复了扩展方法递归调用自己的错误 2.0.0 主要重构到代码库。

Delphi SOAP WebService 服务器端多个 SoapDataModule 实现相同的接口方法,接口继承

WebService 服务器端,为了方便代码管理,将不同的业务逻辑,分到不同的 TSoapDataModule 里面去。这样好对代码做模块化管理。多个 TSoapDataModule 可能需要实现相同的接口方法,每个 TSoapDataModule 模块对该方法的实现代码可能不同(因为业务不同);最简单可能性是每个模块要检查的客户端访问权限不同。那么,在客户端,因为是调用服务器端的不同接口的相同方法,如果给每个接口写一次方法调用,代码冗余。服务器端:服务器端的接口,默认(IDE 自动生成的代码)从 IApp

pcplayer的博客 643

Delphi Service Application

利用Service Application创以服务形式运行服务器程序,该Demo提供与用户交互界面,托盘图标显示,适应刚接触Service开发初学者

Delphi编写soap服务器与客户端程序[收集].pdf

Delphi编写soap服务器与客户端程序[收集].pdf

类方法和类变量的使用

Delphi 语法,有类方法 class procedure 和 class function ;也有类变量 class var。可以用来干嘛?WebService 服务器端,多个 SoapDataModule 共用的方法,放到一个 DataModule 里面去。每次 SOAP 调用,需要在 SoapDataModule 实现接口方法里面,创建该 DataModule 的实例,调用其方法,然后释放。创建和释放的代码,总是重复。并且,没有对象缓冲池。当然,可以给这个 DataModule 实现一个基于接口释放

pcplayer的博客 692

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本征矩阵,单应矩阵梳理)附c++源码

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本质矩阵,单应矩阵梳理)附c++源码对极几何是什么,它有什么用(整体流程理解)对极约束(描述两相机关系)基础矩阵特性与求解方法本质矩阵特性与求解方法相机姿态恢复方法怎么又冒出了个单应矩阵H? 对极几何是什么,它有什么用(整体流程理解) 如图,当空间上有一个点分别在相机1和相机2上进行成像,这两个点存在什么变换关系呢?再扩展一下,真实世界下的场景分别用两个相机进行拍摄,获得两张照片,两张照片有什么变换关系呢?那么对极几何就是用来描述这种变换关系的。

qq_37764141的博客 5104

编写一个基于Soap DataModule的三层数据库应用

服务器端:建立一个Web App Debugger executable类型,不需要接口,添加一个SoapData Module,放上AdoCon,AdoDataSet,DataSetProvider1设置数据好连接,利用AdoDataSet打开一个数据集,然后编译运行,打开WebAppDebugger查看是否正确.客户端:(1)建立一个普通的应用程序,添加SoapConnection1组件,设置...

weixin_33788244的博客 93

离散数学期末复习笔记【精华版】

文章目录前言一、????理逻辑1. 命题逻辑2. 等值演算3. 主合取范式、主析取范式4. 【题】推理证明5. 辖域、自由变元、约束变元二、????合1. 环和、环积,幂集,笛卡尔乘积三、 ????????关系1. 自反、对称、传递2&3. 合成运算,逆关系、闭包4. 哈斯图、上下界、偏序5. 等价关系、划分四、????1. 幺元(么元、单位元)、零元、逆元,半群、群、阿尔贝群、独异点、循环独异点2. 【题】由表判断3. 【题】证明五、????论1. 简单图、平凡图、多重图、子图、补图、出度、入度、

林大夕可的博客 17万+

Vue3项目实战:用vue-print-nb搞定多页表格打印(附样式不丢失解决方案)

本文详细介绍了在Vue3项目中,如何利用vue-print-nb插件解决Element Plus多页表格打印的样式丢失与分页错乱等核心难题。通过分离打印视图、编写专用CSS控制分页行为、以及深入理解浏览器打印原理,提供了一套从基础配置到高级技巧的完整企业级打印解决方案,确保打印输出专业可靠。

linux的博客 1233

Delphi 编写调用WebService接口的小程序

Delphi 编写调用WebService接口的小程序 最近由于项目需要在编写一个webservice的客户端,网上找来了不少资料,都说可以通过delphi自带的向导来生成调用接口的文件。 如对天气预报的webservice调用http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl ,查看各地的天气预报 1、打开delphi开发软件到 File--> New--> Application 新建一个工程,在窗体上放置两个

全欣 的专栏 2317

A股历史数据免费下载终极指南:4000+个股数据一键打包获取

本文提供了获取A股历史数据的完整免费方案,重点介绍了Tushare Pro、AkShare等开源金融数据API的使用方法。通过详细的Python脚本示例,指导读者如何自动化批量抓取、清洗、存储4000多只个股的历史行情数据,并分享数据质量校验与性能优化技巧,助力量化研究与市场分析。

ooo22的博客 2236

Delphi XE7+Webservice三层架构ERP系统简介

本文介绍了使用XE7+FileDAC+WebService技术方案搭建的三层架构的ERP系统案例展示,目前在畜牧业中使用,尤其适合中小型企业。

yueyun889的专栏 1947

一文读懂AI大模型时代的RAG技术

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合检索技术与生成模型的技术架构,旨在通过动态引入外部知识库增强大语言模型(LLM)的生成能力。其核心思想是通过检索系统从外部数据源(如企业知识库、实时文档等)获取相关信息,并将检索结果作为上下文输入生成模型,以提高生成答案的准确性、时效性和专业性

awei0916的专栏 2119

ADC学习(3)——采样电路

第三章 采样电路

夏风喃喃的博客 3万+

c#调用delphi编写的SOAP Web Service(1)

c#如何调用delphi写的SOAP Web Service呢? 网上看到两种方法, 1、通过在Vistual Studio,增加web refrence的方式从wsdl引入wrapper,但是,总是报类型错误,开始怀疑可能是不支持某些特定类型,如olevariant。但仔细查看VS的警告信息,发现与wsdl中没有输出某些从TRemoteable继承下来的复杂类型有关。Delphi的wsdl只

華華的博客 3116

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数。

qq_39541524的博客 827

Delphi Soap WebService 的 HTTP Cookies

前情提要: Delphi SOAP WebService 服务器端多个 SoapDataModule 的做法 Delphi 写 WebService 架构的三层程序如何维护 Session Delphi 的 WebService 的 Cookie 操作 问题起因 在使用 Delphi 开发 SOAP WebService 服务器端和客户端的过程中,我们可以使用 HTTP Cookies 来实现用户身份验证,或者一些【状态】的传递,而客户端基本上不需要写代码。采用其它方法,每次客户端需要和服务.

pcplayer的博客 917

万字长文,小白新手怎么开始做YOLO实验,从零开始教!整体思路在这里,科研指南针!

万字长文,小白新手怎么开始做YOLO实验,从零开始教!整体思路在这里,科研指南针!

Coding... 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

delphi D10.X 生成WebService接口介绍

概述 WebService是一种跨编程语言和跨操作系统平台的远程调用技术。他是基于http的soap协议传输数据 webservice=soap=http+xml,webservice协议就是有http+xml组成的,其中xml中会用到wsdl,而wsdl是描述语言xml中的一种格式。 WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。 这是一种很早就出现的数据交互技术,现在的系统中很少再使用到,在用的多数是原有系统沿用下来的。 当年使

tanqth的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

delphi webserver soap头(soap header)信息传送

在做一个webserver 接口的时候,需要在soap header传送登录后的SessionId,通常delphi生成接口后传送的XML里是不会有包括header数据信息的,这就只能是写代码增加上去。 那么,首先我们需要先自行定义一个类: const IS_TEXT = $0020; {一个常量,也很重要} //这个定义了 Header信息基础类 TSessionIdHeader = class(TSOAPHeader) private FValue: string;

tanqth的专栏 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Delphi调用WebService(通过SoapHeader认证)经验总结

项目(Delphi开发)需要调用另一个系统的WebService。走了不少弯路,现记录总结一下经验。以下是WebService要求: 1、WebService概述 营销Webservice接口采用Apache Axis(version 1.4)技术实现。客户端和服务器用SOAP(Simple Object Access Protocol)协议通过HTTP来交互,客户端根据WSDL描述文档生...

weixin_33965305的博客 1699
上一篇: Delphi WebService Soap 一次提交多个 ClientDataSet 的简单方法
下一篇: Delphi Soap WebService 的 HTTP Cookies
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值