正在 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>
编辑 Here 您可以看到 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
的元素节点
所以改前缀没有问题。库可以对 generate/optimize 输出执行此操作。
但是,您的 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 用于 php 生成器,您将只处理 PHP 对象,而 XML 请求将由 SoapClient 按顺序在本机生成将其发送到 SOAP 服务器。
如果我可以向您推荐一些好的 WSDL 到 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>
编辑 Here 您可以看到 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
的元素节点
所以改前缀没有问题。库可以对 generate/optimize 输出执行此操作。
但是,您的 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 用于 php 生成器,您将只处理 PHP 对象,而 XML 请求将由 SoapClient 按顺序在本机生成将其发送到 SOAP 服务器。
如果我可以向您推荐一些好的 WSDL 到 php 生成器: