Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过PHP SoapClient请求发送原始XML_Php_Soap_Nusoap - Fatal编程技术网

通过PHP SoapClient请求发送原始XML

通过PHP SoapClient请求发送原始XML,php,soap,nusoap,Php,Soap,Nusoap,我试图简单地通过PHP和SoapClient将原始xml发送到Web服务。问题是,当我对XML进行编码时,它会改变转换为关联数组的XML中元素的顺序 // Initialize the Soap Client: $this->_transactionServicesClient = new SoapClient($soapWSDLUrl); 将以下XML作为字符串发送到我的SoapClient的最佳方式是什么 <?xml version="1.0" encoding="UTF-8"

我试图简单地通过PHP和SoapClient将原始xml发送到Web服务。问题是,当我对XML进行编码时,它会改变转换为关联数组的XML中元素的顺序

// Initialize the Soap Client:
$this->_transactionServicesClient = new SoapClient($soapWSDLUrl);
将以下XML作为字符串发送到我的SoapClient的最佳方式是什么

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.micros.com/pos/les/TransactionServices">
    <SOAP-ENV:Body>
        <ns1:PostTransaction>
            <ns1:REQ>
                <ns1:RequestHeader>
                    <ns1:InterfaceVersion>3.0.7</ns1:InterfaceVersion>
                    <ns1:ClientName>TRANS_SERVICES</ns1:ClientName>
                </ns1:RequestHeader>    
                <ns1:CheckDetailEntries>
                    <ns1:MenuItem>
                        <ns1:ReferenceEntry>Pizza4</ns1:ReferenceEntry>
                        <ns1:Count>1</ns1:Count>
                        <ns1:Price>10.00</ns1:Price>
                        <ns1:ItemNumber>112001</ns1:ItemNumber>
                        <ns1:PriceLevel>1</ns1:PriceLevel>
                        <ns1:Seat xsi:nil="true"/>
                    </ns1:MenuItem>
                </ns1:CheckDetailEntries>
                <ns1:CheckHeaderRequest>
                    <ns1:CheckId>03:21:05.050505</ns1:CheckId>
                    <ns1:GuestCount>1</ns1:GuestCount>
                    <ns1:GuestInformation>
                    <ns1:ID>001</ns1:ID>
                    <ns1:FirstName>xxx</ns1:FirstName>
                    <ns1:LastName>xxx</ns1:LastName>
                    <ns1:Address1>xxx Rd</ns1:Address1>
                    <ns1:Address2>xx</ns1:Address2>
                    <ns1:Address3>xx</ns1:Address3>
                    <ns1:PhoneNum>xx</ns1:PhoneNum>
                    <ns1:UserText1>None</ns1:UserText1>
                    <ns1:UserText2>None</ns1:UserText2>
                    <ns1:UserText3>None</ns1:UserText3>
                    <ns1:GUID></ns1:GUID></ns1:GuestInformation>
                </ns1:CheckHeaderRequest>
                <ns1:OrderTypeNumber>1</ns1:OrderTypeNumber>
            </ns1:REQ>
        </ns1:PostTransaction>
    </SOAP-ENV:Body>        
</SOAP-ENV:Envelope>

3.0.7
运输服务
比萨饼
1.
10
112001
1.
03:21:05.050505
1.
001
xxx
xxx
xxx路
xx
xx
xx
没有一个
没有一个
没有一个
1.

更新/解析:以下是我用来扩展SOAP客户端和发送原始SOAP信封的代码:


出于测试目的,您可以将SoapClient子类化并重写_doRequest方法—它接收生成的XML,您可以对其进行预处理

但最好找出XML编码的问题所在。您可以使用SoapVar和SoapParam实例来指定给定对象的确切表示方式。当必须提供名称空间的时候,它们救了我的命

更新/解析:以下是我用来扩展SOAP客户端和发送原始SOAP信封的代码

下面是我如何扩展SoapClient的:

<?php
class MySoapClient extends SoapClient {

    function __construct($wsdl, $options) {
        parent::__construct($wsdl, $options);
        $this->server = new SoapServer($wsdl, $options);
    }
    public function __doRequest($request, $location, $action, $version) 
    { 
        $result = parent::__doRequest($request, $location, $action, $version); 
        return $result; 
    } 
    function __myDoRequest($array,$op) { 
        $request = $array;
        $location = 'http://xxxxx:xxxx/TransactionServices/TransactionServices6.asmx';
        $action = 'http://www.micros.com/pos/les/TransactionServices/'.$op;
        $version = '1';
        $result =$this->__doRequest($request, $location, $action, $version);
        return $result;
    } 
}

// To invoke my new custom method with my Soap Envelope already prepared.
$soapClient = new MySoapClient("http://xxxx:xxxx/TransactionServices/TransactionServices6.asmx?WSDL", array("trace" => 1)); 
$PostTransaction = $soapClient->__myDoRequest($orderRequest,$op); 
?>


也发布在pastie.org上:在我将此转化为答案之前。

我很困惑-您是否将XML发送到SOAP服务,但它没有被解析,或者您有想要在SOAP消息中发送的XML?我有想要在SOAP消息中发送的XML。当我发送在关联数组中编码的数据时,节点失去了其原始顺序,从而中断了请求。例如:在CheckDetailEntries中,可以有菜单项或调味品标签。但是,要将调味品与菜单项关联起来,它们必须按照特定的顺序,这在我编码XML时丢失了。所以我只需要将XML字符串发送到方法PostTransaction进行处理。是否有其他方法可以将它们关联起来?对我来说,依赖传入XML的顺序似乎有点脆弱……不幸的是,这就是Micros TransactionServices的工作方式。所有调味品都必须遵循与之关联的菜单项。发生的情况是,当我的XML被编码到关联数组时,它会降低CheckDetailEntries中元素的顺序。在我的XML中我有MenuItem,调味品,MenuItem,调味品。但是,当XML被转换时,它将[MenuItems][0]和[MenuItems][1]分组,然后在解码时生成MenuItem、MenuItem、调味品、调味品的顺序,从而使这两种调味品都与最后一个MenuItem相关联。我将研究SoapVar和SoapParam。谢谢是否可以使用函数名发送_soapCall,而不是将参数作为数组发送,我是否可以将XML字符串发送给它?我不知道怎么做。谢谢@Fostah因为您已经接受了答案,显然它帮助您调试/更正了程序,但是您介意发布错误XML的确切原因吗?我最终扩展了我的SoapClient并创建了自己的_doRequest方法,允许我直接发送一个成型的Soap信封。这是工作结果。您是否将XML字符串作为$orderRequest传递?