zoukankan      html  css  js  c++  java
  • php使用webservice调用C#服务端/调用PHP服务端

      由于公司业务需要,用自产平台对接某大厂MES系统,大厂提出使用webservice来互通,一脸懵逼啊,一直没有使用过php的webservice的我,瞬间打开手册开始阅读,最终爬过无数坑之后,总结出如下几点

    1.php充当服务端时 如果使用的是框架(TP,Laravel等) $server->setClass("appindexcontrollerOee"); 一定要是命名空间形式 否则找不到类  原生php的话直接写类名即可

    2.服务端的'uri' 一定要和 客户端的 ‘uri’对应上

    不多啰嗦了,进入正题,webservice有两种模式 一种是有 wsdl的 一种是无wsdl的

    PHP充当客户端代码

    $client = new SoapClient('你的soap地址?wsdl');
                $client->soap_defencoding = 'utf-8';
                $client->xml_encoding = 'utf-8';
                $xmlString = "<WorkRequest><Code>essa0001</Code><MaterialCode>2013</MaterialCode><MaterialName>1000</MaterialName><FinalMaterialQuantity>1000</FinalMaterialQuantity><ActualQuantity>800</ActualQuantity><PlanStartTime>2019-07-08</PlanStartTime><ActualStartTime>2019-07-09</ActualStartTime></WorkRequest>";    //参数
    
                $param_ary = array( array("xmlString"=>$xmlString) );  //php请求C#后台 参数必须为二维数组
                $client = $client->__soapCall('ProductionInfoPost',$param_ary);  //php请求C#服务端 请求必须为__soapCall('方法名',参数)
    
    
            //将XML转为数组   可省略
                $array = (array)(simplexml_load_string($client->ProductionInfoPostResult));
                foreach ($array as $key=>$item){
                    $array[$key]  =  $this->struct_to_array((array)$item);
                }
    
                dump($array);die;    
    

      C#服务端代码 自行百度 随便一个都可以用的哈

    php充当客户端

    ni_set('soap.wsdl_cache_enabled', "0"); //关闭wsdl缓存
    
                $soap = new SoapClient('http://你的soap网址/Service.php?wsdl');
                $xml = "<PACKAGE><C3>**电信</C3><C4></C4><LINKMAN>张三</LINKMAN><LINKNUM>13412341234</LINKNUM><LINKADDRESS>广东深圳</LINKADDRESS><REMARK>iPhone6</REMARK><CHANNEL></CHANNEL><GRIDCODE>1111111111111111111111111111111</GRIDCODE><AGENTCODE>2111</AGENTCODE></PACKAGE>";
                $res = $soap->Add($xml);
    

      php充当服务端代码   

    Service.php
    <?php
    class Service {
    
        public function HelloWorld() {
            return "Hello";
        }
    
        public function Add($data) {
           $data=array('data1'=>array('name'=>'张三','sex'=>'男','age'=>18),'data2'=>array('name'=>'李梅','sex'=>'女','age'=>20),'data3'=>array("name"=>'亨利','sex'=>'男','age'=>22));
          	
            return xml($data);
        }
    

      如果需要生成wsdl 附属下面生成wsdl代码

    <?php
    
    include("Service.php");
    include("SoapDiscovery.php");
    
    $disco = new SoapDiscovery('Service', 'soap'); //第一个参数是类名(生成的wsdl文件就是以它来命名的),即Service类,第二个参数是服务的名字(这个可以随便写)。
    $disco->getWSDL();
    SoapDiscovery.php
    <?php
    
    /**
     * Copyright (c) 2005, Braulio Jos?Solano Rojas
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without modification, are
     * permitted provided that the following conditions are met:
     *
     *     Redistributions of source code must retain the above copyright notice, this list of
     *     conditions and the following disclaimer.
     *     Redistributions in binary form must reproduce the above copyright notice, this list of
     *     conditions and the following disclaimer in the documentation and/or other materials
     *     provided with the distribution.
     *     Neither the name of the Solsoft de Costa Rica S.A. nor the names of its contributors may
     *     be used to endorse or promote products derived from this software without specific
     *     prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
     * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
     * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *
     * @version $Id$
     * @copyright 2005
     */
    
    /**
     * SoapDiscovery Class that provides Web Service Definition Language (WSDL).
     *
     * @package SoapDiscovery
     * @author Braulio Jos?Solano Rojas
     * @copyright Copyright (c) 2005 Braulio Jos?Solano Rojas
     * @version $Id$
     * @access public
     * */
    class SoapDiscovery {
    
        private $class_name = '';
        private $service_name = '';
    
        /**
         * SoapDiscovery::__construct() SoapDiscovery class Constructor.
         *
         * @param string $class_name
         * @param string $service_name
         * */
        public function __construct($class_name = '', $service_name = '') {
            $this->class_name = $class_name;
            $this->service_name = $service_name;
        }
    
        /**
         * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
         *
         * @return string
         * */
        public function getWSDL() {
            if (empty($this->service_name)) {
                throw new Exception('No service name.');
            }
            $headerWSDL = "<?xml version="1.0" ?>
    ";
            $headerWSDL.= "<definitions name="$this->service_name" targetNamespace="urn:$this->service_name" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:$this->service_name" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/">
    ";
            $headerWSDL.= "<types xmlns="http://schemas.xmlsoap.org/wsdl/" />
    ";
    
            if (empty($this->class_name)) {
                throw new Exception('No class name.');
            }
    
            $class = new ReflectionClass($this->class_name);
    
            if (!$class->isInstantiable()) {
                throw new Exception('Class is not instantiable.');
            }
    
            $methods = $class->getMethods();
    
            $portTypeWSDL = '<portType name="' . $this->service_name . 'Port">';
            $bindingWSDL = '<binding name="' . $this->service_name . 'Binding" type="tns:' . $this->service_name . "Port">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    ";
            $serviceWSDL = '<service name="' . $this->service_name . "">
    <documentation />
    <port name="" . $this->service_name . 'Port" binding="tns:' . $this->service_name . "Binding"><soap:address location="http://" . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . "" />
    </port>
    </service>
    ";
            $messageWSDL = '';
            foreach ($methods as $method) {
                if ($method->isPublic() && !$method->isConstructor()) {
                    $portTypeWSDL.= '<operation name="' . $method->getName() . "">
    " . '<input message="tns:' . $method->getName() . "Request" />
    <output message="tns:" . $method->getName() . "Response" />
    </operation>
    ";
                    $bindingWSDL.= '<operation name="' . $method->getName() . "">
    " . '<soap:operation soapAction="urn:' . $this->service_name . '#' . $this->class_name . '#' . $method->getName() . "" />
    <input><soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </input>
    <output>
    <soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </output>
    </operation>
    ";
                    $messageWSDL.= '<message name="' . $method->getName() . "Request">
    ";
                    $parameters = $method->getParameters();
                    foreach ($parameters as $parameter) {
                        $messageWSDL.= '<part name="' . $parameter->getName() . "" type="xsd:string" />
    ";
                    }
                    $messageWSDL.= "</message>
    ";
                    $messageWSDL.= '<message name="' . $method->getName() . "Response">
    ";
                    $messageWSDL.= '<part name="' . $method->getName() . "" type="xsd:string" />
    ";
                    $messageWSDL.= "</message>
    ";
                }
            }
            $portTypeWSDL.= "</portType>
    ";
            $bindingWSDL.= "</binding>
    ";
            //return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');
            //生成wsdl文件,将上面的return注释
            $fso = fopen($this->class_name . ".wsdl", "w");
            fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'));
        }
    
        /**
         * SoapDiscovery::getDiscovery() Returns discovery of WSDL.
         *
         * @return string
         * */
        public function getDiscovery() {
            return "<?xml version="1.0" ?>
    <disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/" xmlns:scl="http://schemas.xmlsoap.org/disco/scl/">
    <scl:contractRef ref="http://" . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . "?wsdl" />
    </disco:discovery>";
        }
    
    }
    
    ?>
    

      大致就是这样 没有很难 只是很烦 坑太多 同平台肯比较少 如果跨平台 坑太多了 希望可以帮助小伙伴们少入坑吧

      如果有小伙伴不明白 可以随时给我留言 帮你解决 共同学习

  • 相关阅读:
    Windows系统创建符号链接文件
    msi软件包无法安装
    删除我的电脑里面软件快捷方式
    本地连接速度100.0mbps变10.0mbps如何恢复
    如何清理多余的Windows桌面右键菜单
    Windows免密码远程桌面
    Win8节省C盘空间攻略
    利用FTP将Linux文件备份到Windows
    Windows服务器之间rsync同步文件
    解决“Word无法访问您试图使用的功能所在的网络位置”问题
  • 原文地址:https://www.cnblogs.com/we-jack/p/11151221.html
Copyright © 2011-2022 走看看