加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何从这个xml在php中生成一个soap请求?

发布时间:2020-12-16 07:57:23 所属栏目:百科 来源:网络整理
导读:我厌倦了尝试用SOAP发送请求.这是我的xml soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common" xmlns:bpf1="http://sc
我厌倦了尝试用SOAP发送请求.这是我的xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common" xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">
         <soapenv:Header>
 <InfoTag xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/BaufestProductivityFramework">
  <ClientIp xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">200.125.145.10</ClientIp> 
  <CompanyId xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">1</CompanyId>
  <UserName xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">someUser</UserName> 
  </InfoTag>
        </soapenv:Header>
           <soapenv:Body>
              <tem:LogIn>         
                <tem:token>
                    <bpf:type>
                       <bpf1:Description>someDesc</bpf1:Description>
                       <bpf1:Id>1</bpf1:Id>
                       <bpf1:Name>someDesc</bpf1:Name>
                    </bpf:type>
                    <bpf:password>somePass</bpf:password>
                    <bpf:userName>someUser</bpf:userName>
                </tem:token>
              </tem:LogIn>
           </soapenv:Body>
        </soapenv:Envelope>

这个函数发送带有命名空间的标题,但是有多个…我必须发送它们全部?

private function __getHeaders() {
            $ns = 'http://schemas.xmlsoap.org/soap/envelope/'; //Namespace of the WS. 
            $ip = $_SERVER['REMOTE_ADDR'];
    //Body of the Soap Header. 
            $headerbody = array('ClientIp' => $ip,'CompanyId' => 1,'UserName' => 'someUser'
                                );

    //Create Soap Header.        
            $header = new SOAPHeader($ns,'InfoTag',$headerbody);
            return $header;
        }

    public function prepareWs(){
    $wsdl="the web service";
           $client = new SoapClient($wsdl,array('trace' => true));
    //Set the Headers of Soap Client. 
           $header = $this->__getHeaders();
           $client->__setSoapHeaders($header);

我尝试发送这个主体,我检查了肥皂故障的异常,但消息只返回“错误请求NULL NULL NULL”.

$params = new stdClass();  
      $params = new SoapVar("<tem:token>
        <bpf:type xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common">
           <bpf1:Description xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">someDesc</bpf1:Description>
           <bpf1:Id xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">1</bpf1:Id>
           <bpf1:Name xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">someName</bpf1:Name>
        </bpf:type>
        <bpf:password xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common">somePass</bpf:password>
        <bpf:userName xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common">someUser</bpf:userName>
    </tem:token>",XSD_ANYXML);

       $response = $client->Login($params);

}

使用CURL,我可以发送此XML并收到XML响应,但是使用SOAPClient我无法发送此请求.

我希望有人可以帮助我,谢谢.

这是我用firebug看到的代码,我唯一得到的是“糟糕的请求”.当我使用__getLastRequest()时,我看到了同样的……
我想不应该正确发送标题,但__setSoapHeaders函数返回true.
这是输出:

<soap-env:envelopexmlns:ns1="http://tempuri.org/"xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:header>
<soap-env:contextinformation>
<item>
<key>ClientIp</key>
<value>127.0.0.1</value>
</item>
<item>
<key>CompanyId</key>
<value>1</value>
</item>
<item>
<key>UserName</key>
<value>someUser</value>
</item>
</soap-env:contextinformation>
</soap-env:header>
<soap-env:body>
<tem:login>
<tem:token>
<bpf:type>
<bpf1:description>someDesc</bpf1:description>
<bpf1:id>1</bpf1:id>
<bpf1:name>someName</bpf1:name>
</bpf:type>
<bpf:password>somePass</bpf:password>
<bpf:username>someUser</bpf:username>
</tem:token>
</tem:login>
</soap-env:body>
</soap-env:envelope>
SoapHeader相当随意地处理数组.如果您想使用阵列,请考虑使用 ArrayObject instead of the native construct.

但是,您根本不需要数组,因为您只是尝试在标头中构造单个元素.而且因为每个内部元素(例如ClientIP)都有一个唯一的命名空间,所以您不能只传入一个基本对象.相反,您必须使用SoapVar类为每个元素指定一个特定的命名空间,它允许您将正常的PHP数据包装在SoapClient可以理解和翻译的“SOAP-ready”容器中.

$innerNS = "http://www.w3.org/BaufestProductivityFramework";
$outerNS = "http://schemas.datacontract.org/2004/07/Bpf.Common.Service";

$tag = new stdClass();
$tag->ClientIP = new SoapVar("200.125.145.10",XSD_STRING,null,$innerNS);
$tag->CompanyId = new SoapVar(1,XSD_INT,$innerNS);
$tag->UserName = new SoapVar("someUser",$innerNS);

$client->__setSoapHeaders(new SoapHeader($outerNS,$tag));

最后,作为一项规则,不要手动编写XML!考虑重写您的SOAP正文代码,如此处所示的标题代码.您应该能够专门处理XML的内容,而不是其结构.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读