在PHP中生成XML SOAP消息


Generating XML SOAP message in PHP

我需要帮助在PHP中生成XML SOAP消息。我使用的是BeSimpleSoap扩展。我已经尝试了许多不同的方法来生成SOAP消息。消息应该像这样:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://apis-it.hr/umu/2015/types/kp" xmlns:gsb="http://apis-it.hr/umu/2013/types/gsb">
   <soapenv:Header/>
   <soapenv:Body>
      <gsb:SendMessageRequest>
         <gsb:GsbEnvelope>
            <gsb:MessageHeader>
               <gsb:SenderId>1</gsb:SenderId>
               <gsb:ServiceId>126</gsb:ServiceId>
               <gsb:MessageId>c4413331-1cff-11e2-f516-242d656ac4b3</gsb:MessageId>
               <gsb:SenderTimeStamp>2015-05-31T12:00:00</gsb:SenderTimeStamp>
            </gsb:MessageHeader>
            <gsb:Content>
               <gsb:MimeType>aaa</gsb:MimeType>
               <gsb:Data encoding="EMBEDDED">
                     <tns:Upit>
                        <tns:IdPosiljatelja>1</tns:IdPosiljatelja>
                        <tns:TipPoruke>1</tns:TipPoruke>
                        <tns:IdUpita>732262f1-063f-11e2-892e-0812200c9f68</tns:IdUpita>
                        <tns:DatumVrijemeUpita>2015-03-26T15:33:29.371+01:00</tns:DatumVrijemeUpita>
                     </tns:Upit>
               </gsb:Data>
            </gsb:Content>
         </gsb:GsbEnvelope>
      </gsb:SendMessageRequest>
   </soapenv:Body>
</soapenv:Envelope>

我试着用这个生成XML:

$encodded = new SoapVar("<tns:Upit>
                                <tns:IdPosiljatelja>196</tns:IdPosiljatelja>
                                <tns:TipPoruke>$TipPoruke</tns:TipPoruke>
                                <tns:IdUpita>$UUID</tns:IdUpita>
                                <tns:DatumVrijemeUpita>$date_time</tns:DatumVrijemeUpita>
                            </tns:Upit>", XSD_ANYXML); 
    $par_envelope=array( "GsbEnvelope" =>  
        array( "MessageHeader" => 
            array("SenderId" => "24",
                "ServiceId" => "$ServiceId",
                "MessageId" => $UUID,
                "SenderTimeStamp" => $date_time),
                "Content" => array("MimeType" =>"application/xml","Data" =>array("any"=>$encodded,"encoding"=>"EMBEDDED"))));
    $par_WSDL=array("trace"=>TRUE,
        "exceptions"=>TRUE,
        'location'=>$SERVICE_TEST,
        "local_cert" =>$SOAP_cert,
        'uri'=>$NAMESPACE_URI,
        "passphrase"=>$cert_password,
        "connection_timeout" => 60);
    $client = new BeSimple'SoapClientSoapClient("GSBService.wsdl",$par_WSDL);
    $result=$client->sendMessage($par_envelope);

但是这只生成了XML消息的一部分,看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://apis-it.hr/umu/2013/types/gsb">
    <SOAP-ENV:Body>
        <ns1:SendMessageRequest>
            <ns1:GsbEnvelope>
                <ns1:MessageHeader>
                    <ns1:SenderId>1</ns1:SenderId>
                    <ns1:ServiceId>1</ns1:ServiceId>
                    <ns1:MessageId>34578b73-988a-4727-bee4-a287218cc0a1</ns1:MessageId>
                    <ns1:SenderTimeStamp>2015-10-01T09:07:25+02:00</ns1:SenderTimeStamp>
                </ns1:MessageHeader>
                <ns1:Content>
                    <ns1:MimeType>application/xml</ns1:MimeType>
                    <ns1:Data/>
                </ns1:Content>
            </ns1:GsbEnvelope>
        </ns1:SendMessageRequest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope> 

EDIT在这里可以看到WSDL和XSD文件。

似乎库添加了自己的名称空间前缀。这不是问题。在XML中,以下3个示例具有相同的含义:

  • <ns1:SendMessageRequest xmlns:ns1="http://apis-it.hr/umu/2013/types/gsb">
  • <gsb:SendMessageRequest xmlns:gsb="http://apis-it.hr/umu/2013/types/gsb">
  • <SendMessageRequest xmlns="http://apis-it.hr/umu/2013/types/gsb">

XML解析器将所有3解析为名称空间http://apis-it.hr/umu/2013/types/gsb中具有本地名称SendMessageRequest的元素节点。

所以改变的前缀不是问题。库可以这样做来生成/优化输出。

但是,XML Soap变量不是有效的XML。您没有添加名称空间定义。如果元素有前缀,则需要在元素节点或其祖先节点上为该前缀定义名称空间。

$encoded = new SoapVar(
  "<tns:Upit xmlns:tns='http://apis-it.hr/umu/2015/types/kp'>
     <tns:IdPosiljatelja>196</tns:IdPosiljatelja>
     <tns:TipPoruke>$TipPoruke</tns:TipPoruke>
     <tns:IdUpita>$UUID</tns:IdUpita> 
     <tns:DatumVrijemeUpita>$date_time</tns:DatumVrijemeUpita>
   </tns:Upit>", 
  XSD_ANYXML
); 

我建议您只使用数组或对象来生成简单地作为参数传递给SoapClient的请求。而不是混合xml字符串和对象。

例如,如果您使用WSDL to php生成器,您将只处理php对象,XML请求将由SoapClient本地生成,以便将其发送到SOAP服务器。

如果我能给你一些好的WSDL到php生成器:

  • wsdltophp.com
  • PackageGenerator