问题:我正在向第三方服务器发送SOAP请求,并且在我的一个标签内部我已全部“&lt;” “&gt;” 中替换为html-entities <
>
信息: 假设我有这个类(为了清晰起见,简化和伪编码):
Class SoapSender {
private $session = 'sessionHash';
private $soap = new SoapClient(/* settings */);
public function create() {
try {
$agr = [];
$agr['SessionToken'] = $this->session;
$agr['Document'] = $this->prepareDocument();
$request = $this->soap->createRequest($agr); // 3rd-party call
} catch (SoapFault $f) {
/* handle exception */
}
}
第三方的文档说<Document>
应该是XML字符串,所以我这样做:
private function prepareDocument() {
$arr = [
/* Create all sub-tags of <Document> */
];
$xml = Formatter::make($arr, 'array')->toXml();
// this operations required for valid structure
$xml = str_replace(array('<?xml version="1.0" encoding="utf-8"?>','<xml>','</xml>'), '', $xml);
$xml = str_replace(['Subject_1', 'Subject_2'], 'Subject', $xml);
$xml = str_replace(['Period_1', 'Period_2'], 'Period', $xml);
$xml = preg_replace('/Store_[1-9]/', 'Store', $xml);
return $xml;
Formatter
是SoapBox/laravel-formatter。
Soo,当我发送请求并收到错误的回复时,我转储$this->soap->__getLastRequest()
并看到:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://someurl.com">
<SOAP-ENV:Body><ns1:CreateRequest>
<Document>
<General><Product>Bread</Product><DateBeg>2016-04-04T00:00:00</DateBeg><DateEnd>2017-04-03</DateEnd><.....
...........blah-blah....
</Document>
<SessionToken>SessionTokeon</SessionToken></ns1:CreateRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>
到目前为止我所拥有的内容: debuging prepareDocument
说我在utf-8中有完整的xml字符串,所有标记都是完整的,因此将它们编码为html实体会在SOAP请求中发生。只有Document
标记被编码,其他标记都可以。
我使用相同方法的所有其他服务,但不同的第三方作品完美无缺。 SOAP UI发送此请求(但已解码回正常)可以正常工作。一切都发生在laravel项目中。
问题再次出现:我正在向第三方服务器发送请求,并且在我的一个标签内部我已全部“&lt;” “&gt;” 中替换为html-entities <
>
问题:我该怎么做才能解决这个问题?