Java写 soapclient,PHP通过SoapClient调用Java发布的WebService

php通过接口调用数据时,长用的为:http和webservice两种方法。

http 是指:接口端提供http链接,将数据以json或XML格式输出到网页中。php调用端通过file_get_contents或curl方法来调用,GET/POST方式来传参。

webservice是指:通过soap读写接口,现在着重来介绍一下这种方法。

php5以后提供了原生的soap方法:SoapClient,需要开启php的php-SOAP服务。如果限于服务器不能开启soap,也可以用 nusoap。nusoap是一个外部类,需要引入后才可调用。

现在介绍一下,用php soap 模块,调用webservice:

以下为最简洁的调用方法:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$url       =   http://xxx.xxx.xx.xx/WebService/service/WebService?wsdl;

//链接服务器端

$client = new SoapClient($url);

//调用提供的方法

$paras      =  array('arg0'=>array('id'=>"33234"));

$aryResult=$client->querySherry($paras);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

说明可能遇到的问题:

1、获取服务器上提供的可调用方法

//获取服务器上提供的可调用方法

print_r($client->__getFunctions ());

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2、获取服务器上提供的数据类型

//获取服务器上的数据类型

print_r($client->__getTypes());

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

升级版,标注颜色:

echo '

';

echo '

Types:

';

$types = $client->__getTypes();

foreach ($types as $type) {

$type = preg_replace(

array('/(\w+) ([a-zA-Z0-9]+)/', '/\n /'),

array('${1} ${2}', "\n\t"),

$type

);

echo $type;

echo "\n\n";

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

输出结果中,方法里的参数即为参数名,例如:

struct querySherry { SherryH5Request arg0; }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

其中”querySherry”方法中,参数为 arg0

3、SoapClient 的参数:

默认情况下,SoapClient不需要链接外的任何参数。但是,有时需要设置一些内容:

例如:

$client    =   new SoapClient("SoapClient",

array(

'soap_version'=>SOAP_1_2,         //设置soap版本,默认为:SOAP_1_1

'trace'     => 1,                 //跟踪异常

'cache_wsdl'=>WSDL_CACHE_NONE,    //禁止缓存服务器 wsdl

'location'=>'',

'uri'=>'',

'login'=>'',

'password'=>'',

'encoding'=>'UTF-8'

));

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

更多参数介绍,请参见:  PHP开发手册 SoapClient::SoapClient

4、无法传递参数,服务器端接收到的参数为null:

php通过soap向接口端传参时,是通过 array 来操作的。例如:

$paras     =   array(array('arg0'=>array('id'=>"33234")));

$aryResult=$client->__soapCall('querySherry',$paras);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

数据一定要放在array里提交,以上参数键值的说明:

arg0:通过 __getTypes 获取的参数名:

id : 接口端提供的键值名。

听java开发说,java调用时,无需 arg0 包裹。

以下为同类文章:

http://www.yunxiu.org/blog/article/5534.htm

http://phpxiaoxin.iteye.com/blog/1555715

http://www.cnblogs.com/smallmuda/archive/2010/10/12/1848700.html

http://www.cnblogs.com/wuhenke/archive/2010/09/30/1839424.html

小奋斗文章

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Java中使用SOAP客户端调用Web服务并传递对象参数,需要遵循以下步骤: 1. 通过wsimport工具生成客户端代码。 2. 创建包含对象属性的类,该类必须是可序列化的,即需要实现Serializable接口。 3. 创建SOAP消息,并将对象参数添加到SOAP Body中。可以使用JAXB将对象序列化为XML。 4. 发送SOAP消息到Web服务,并解析响应消息。 示例代码: 1. 通过wsimport工具生成客户端代码。 首先需要使用wsimport工具根据WSDL文件生成客户端代码。在命令行中执行以下命令: ``` wsimport -keep http://localhost:8080/WebService?wsdl ``` 其中,-keep选项表示生成的Java文件保存在当前目录中。 2. 创建包含对象属性的类。 假设需要传递的对象是Person,具有姓名和年龄两个属性: ``` public class Person implements Serializable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` 3. 创建SOAP消息。 使用JAXB将Person对象序列化为XML,并添加到SOAP消息的Body中: ``` // 创建JAXB上下文 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Marshaller marshaller = jaxbContext.createMarshaller(); // 序列化Person对象为XML Person person = new Person(); person.setName("张三"); person.setAge(20); StringWriter writer = new StringWriter(); marshaller.marshal(person, writer); String xml = writer.toString(); // 创建SOAP消息 MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody body = envelope.getBody(); body.addDocument(new ByteArrayInputStream(xml.getBytes())); ``` 4. 发送SOAP消息到Web服务。 使用生成的客户端代码创建WebService对象,并调用对应的方法: ``` // 创建WebService对象 URL url = new URL("http://localhost:8080/WebService"); WebService service = new WebService(url); // 调用WebService方法 SOAPMessage response = service.call(soapMessage); ``` 其中,WebService是使用wsimport生成的客户端代码中的类。call方法用于发送SOAP消息,并返回响应消息。 5. 解析响应消息。 从响应消息的Body中获取返回的数据: ``` SOAPBody responseBody = response.getSOAPBody(); Node responseNode = responseBody.getFirstChild(); String responseXml = responseNode.getTextContent(); // 反序列化XML为对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); StringReader reader = new StringReader(responseXml); Person result = (Person) unmarshaller.unmarshal(reader); ``` 完整的代码示例: ``` public class SoapClient { public static void main(String[] args) throws Exception { // 创建JAXB上下文 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Marshaller marshaller = jaxbContext.createMarshaller(); // 序列化Person对象为XML Person person = new Person(); person.setName("张三"); person.setAge(20); StringWriter writer = new StringWriter(); marshaller.marshal(person, writer); String xml = writer.toString(); // 创建SOAP消息 MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody body = envelope.getBody(); body.addDocument(new ByteArrayInputStream(xml.getBytes())); // 创建WebService对象 URL url = new URL("http://localhost:8080/WebService"); WebService service = new WebService(url); // 调用WebService方法 SOAPMessage response = service.call(soapMessage); // 解析响应消息 SOAPBody responseBody = response.getSOAPBody(); Node responseNode = responseBody.getFirstChild(); String responseXml = responseNode.getTextContent(); // 反序列化XML为对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); StringReader reader = new StringReader(responseXml); Person result = (Person) unmarshaller.unmarshal(reader); System.out.println(result.getName()); System.out.println(result.getAge()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值