php调用soap

摘要:公司调试需要用到WSDL,所以测试一下一:写一个测试类,简单的封装几个方法;二:生成WSDL文件(用zend studio)

公司调试需要用到WSDL,所以测试一下

一:写一个测试类,简单的封装几个方法
————test.class.php—————

<?php
class CTest{
    public function __construct() {

    }
    
    public function add($a, $b) {
        return $a+$b;
    }

    public function cut($a, $b) {
        return $a-$b;
    }
}

二:生成WSDL文件(用zend studio)
————ceshi.wsdl—————

<?xml version='1.0' encoding='UTF-8'?>
<definitions name="Config1" targetNamespace="urn:Config1" xmlns:typens="urn:Config1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
    <message name="__construct"/>
    <message name="__constructResponse"/>
    <message name="add">
        <part name="a"/>
        <part name="b"/>
    </message>
    <message name="addResponse">
        <part name="addReturn"/>
    </message>
    <message name="cut">
        <part name="a"/>
        <part name="b"/>
    </message>
    <message name="cutResponse">
        <part name="cutReturn"/>
    </message>
    <portType name="CTestPortType">
        <operation name="__construct">
            <input message="typens:__construct"/>
            <output message="typens:__constructResponse"/>
        </operation>
        <operation name="add">
            <input message="typens:add"/>
            <output message="typens:addResponse"/>
        </operation>
        <operation name="cut">
            <input message="typens:cut"/>
            <output message="typens:cutResponse"/>
        </operation>
    </portType>
    <binding name="CTestBinding" type="typens:CTestPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="__construct">
            <soap:operation soapAction="urn:CTestAction"/>
            <input>
                <soap:body namespace="urn:Config1" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>
            <output>
                <soap:body namespace="urn:Config1" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
        <operation name="add">
            <soap:operation soapAction="urn:CTestAction"/>
            <input>
                <soap:body namespace="urn:Config1" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>
            <output>
                <soap:body namespace="urn:Config1" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
        <operation name="cut">
            <soap:operation soapAction="urn:CTestAction"/>
            <input>
                <soap:body namespace="urn:Config1" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>
            <output>
                <soap:body namespace="urn:Config1" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
    </binding>
    <service name="Config1Service">
        <port name="CTestPort" binding="typens:CTestBinding">
            <soap:address location=""/>
        </port>
    </service>
</definitions>

以上所有文件是放在服务器上

三:本地新建一个client.php文件
————client.php—————

<?php
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
$wsdl = 'http://www.work.com/wsdl/ceshi.wsdl'; //换成你本地的地址,这是我的虚拟域名
//$soap = new SoapClient($wsdl, array( 'trace'=>true,'cache_wsdl'=>'WSDL_CACHE_NONE', 'soap_version'   => 'SOAP_1_1'));  
$soap = new SoapClient($wsdl);
//这样也可以实例化soap
//$soap = new SoapClient('http://www.work.com/wsdl/server.php?wsdl'); 
try{  
    //调用方法一:
    $result=$soap->cut(7,2);  
    //调用方法二:
    //$result = $soap->__call('add',array(1,2));
}catch(Exception $e) {  
    echo "Exception: " . $e->getMessage();  
}  
echo $result;

访问client.php
报错:Exception: Unable to parse URL

四:服务器上新建一个server.php文件
————server.php—————

<?php
include_once('test.class.php');
$server = new SoapServer('ceshi.wsdl');
$server->setClass('CTest');
$server->handle();

并且修改ceshi.wsdl:

<soap:address location="http://www.work.com/wsdl/server.php"/>

之前生成的location为空,改成你服务器的server.php的访问路径
再次访问client.php
显示:5
成功了,网上大把的人都不可以访问wsdl,都是因为wsdl的location为空的缘故
当然php要开启soap支持

五:如果没有生成wsdl,也是可以的,不过要修改两个地方
————server.php—————

$server = new SoapServer(null,array('uri'=>'abcd','encoding'=>'UTF-8'));

————client.php—————

$soap = new SoapClient(null,array(
        'location'=>'http://www.work.com/wsdl/server.php',
        'uri'=>'abcd',
         'encoding' => 'UTF-8',
    ));

将两个类实例化的参数改下即可
uri为必要参数,值随便给。

至于uri,网上的说法:
命名空间 URI 为给定的 SOAP 操作指定用于组成 SOAP 请求封装的 XML 命名空间。如果命名空间 URI 未被定义,将使用 URL 子句中的域组件。
服务器端的 SOAP 处理器使用此 URI 来了解请求的消息主体中各种实体的名称。

ps:以上全部测试通过,特分享出来,如有问题请留言。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98459.html

(0)
上一篇 2021年8月21日
下一篇 2021年8月21日

相关推荐

发表回复

登录后才能评论