首页系统soapclient(为什么要使用soapclient)

soapclient(为什么要使用soapclient)

编程之家2024-06-112次浏览

一、php连接webservice每次都要new SoapClient()吗

最近工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经包含了处理soap的模块,但是资料太少了,上php官网上查帮助,写的不是很容易理解,经过多次实践,终于搞清楚了,php调用web service还是非常简单的。下面用一个例子说明:

soapclient(为什么要使用soapclient)

web service服务是查询QQ用户是否在线

使用php5开发客户端:

<?php

try{

//$client= new SoapClient("HelloService.wsdl",array('encoding'=>'UTF-8'));

$client= new SoapClient("webservices/qqOnlineWebService.asmx?wsdl");

soapclient(为什么要使用soapclient)

var_dump($client->__getFunctions());

print("");

var_dump($client->__getTypes());

print("");

class qqCheckOnline{

soapclient(为什么要使用soapclient)

var$qqCode="10000";

};

$arrPara= array(new qqCheckOnline);

$arrResult=$client->__Call("qqCheckOnline",$arrPara);//$client->qqCheckOnline($arrPara);

echo$arrResult->qqCheckOnlineResult."";

} catch(SOAPFault$e){

print$e;

}

?>

代码确实很简单吧,创建SoapClient对象时,可以使用保存在本地WSDL文件,也可以使用远程的地址,后面的array数组里可以带上很多的参数,具体参数可以查php的SoapClient帮助,这里带的是字符集编码,如果调用方法的参数里有中文,一定要指定字符集编码,否则会出错。

调用web service前可以先调用SoapClient的__geunctions()和__getTypes()方法看一下你要调用的web service暴露的方法,参数和数据类型,需要注意的是传入的参数名一定要和soapclient里面定义的一致,否则参数是传不过去的。

需要使用SoapClient的__soapCall()或__call()方法,具体使用方法可以查php的帮助文档。如果参数要求是一个结构体,请用类代替,如上面的代码。

另外发现个问题,如果web service方法返回的是xml格式的字符串,php接收到以后会自己把数据内容解析出来,而不是xml字符串.

二、VB通过SoapClient调用WS,怎么设置超时

我们都知道,调用WS可以在工程中添加对WS的WEB引用。

但是,如果我们不想通过添加引用的方式,而是在代码中动态引用该怎么办呢看

首先,我们该想到WS的实现也是一个类的形式。

其次,WS在传输过程中是通过WSDL来进行描述的(使用SOAP协议)。

因此,我们需要获取WS的WSDL描述,并通过该描述来动态生成程序集。

最后:通过反射来获取新生成的程序集,并调用其方法!

上述步骤需要引用如下四个名称空间:

using System.Web.Services.Description;//WS的描述

//以下几个用于根据描述动态生成代码并动态编译获取程序集

using System.CodeDom;

using Microsoft.CSharp;

using System.CodeDom.Compiler;

上述几个名称空间中包括如下几个重要的类:

using System.Web.Services.Description下:

ServiceDescription//WS描述

ServiceDescriptionImporter//通过描述生成客户端代理类,特别注意其中的Style

以下是MSDN对其的

XML Web services的接口通常由 Web服务描述语言(WSDL)文件来说明。例如,若要获取有关使用处公开的 ASP.NET的 Web服务的 WSDL说明,只需导航到?WSDL。使用 ServiceDescriptionImporter类可以方便地将 WSDL说明中包含的信息导入到System.CodeDom.CodeCompileUnit对象。通过调整 Style参数的值,可以指示 ServiceDescriptionImporter实例生成客户端代理类(通过透明调用该类可提供 Web服务的功能)或生成抽象类(该类封装 Web服务的功能而不实现该功能)。如果将 Style属性设置为 Client,则 ServiceDescriptionImporter生成客户端代理类,通过调用这些类来提供说明的 Web服务的功能。如果将Style属性设置为 Server,则 ServiceDescriptionImporter实例生成抽象类,这些类表示所说明的 XML Web services的功能而不进行实现。然后,可以通过编写从这些抽象类继承的类来对其进行实现,并实现相关的方法。

using System.CodeDom下:

CodedomUnit//它用于设定动态代码的名称空间,类名等,可以通过ServiceDescriptionImporter.Import()方法将WS的描述代码写入该类,以作动态编译用

using System.CodeDom.Compiler下:

CodedomProvider//用于创建和检索代码生成器和代码编译器的实例,我们主要用到其实现子类CShareCodeProvider

可以直接用CShareCodeProvider provider=new CShareCodeProvider()来生成,或者用CodedomProvider.CreateProvider("CSharp")来生成

ICodeCompiler//用于编译基于 System.CodeDom的源代码表示形式。

它通过CodedomProvider的CreateCompiler()方法来

CompilerResults//表示从编译器返回的编译结果。它由ICodeCompiler根据指定的编译器设置从指定的 CodeCompileUnit所包含的 System.CodeDom树中编译程序集并返回。CompiledAssembly属性指示编译的程序集。

了解如上信息后,就可动态调用WS了。

小米平板电脑配置(小米平板电脑的配置如何)华硕m5000(华硕m5000好用吗)