如何用PHP实现XML格式SOAP POST请求并获取可读响应
修正PHP调用SOAP接口的两处问题,获取正确可读响应
针对你遇到的两个问题,直接给你修正方案和完整代码:
1. 修正请求体中的和参数
你需要完全照搬Postman中能正常工作的请求体里的<From>和<To>值,确保参数的格式、内容和Postman里的完全一致——比如如果是特定的编码格式、ID字符串或者日期格式,不能有任何拼写或格式错误。比如Postman里的请求体片段是:
<From>正确的来源值</From> <To>正确的目标值</To>
那PHP代码里的SOAP Envelope就要原封不动把这两个节点的内容替换正确。
2. 处理gzip压缩响应解决乱码
接口返回的是gzip压缩后的内容,PHP不会自动解压,所以需要两步处理:
- 请求头里明确指定
Accept-Encoding: gzip, deflate(和Postman保持一致) - 收到响应后,判断响应头里的
Content-Encoding是否为gzip,若是则用gzdecode()解压内容
完整修正后的PHP代码示例
<?php $url = 'https://apps8.tflite.com/PublicServiceU/Public.svc/asmx'; // 替换成Postman中能正常工作的SOAP请求体,确保<From>和<To>参数正确 $soapBody = <<<XML <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <!-- 这里替换成接口要求的具体方法节点,确保<From>和<To>正确 --> <YourSoapMethodName xmlns="http://tempuri.org/"> <From>正确的From值</From> <To>正确的To值</To> <!-- 其他必要参数 --> </YourSoapMethodName> </soap:Body> </soap:Envelope> XML; $ch = curl_init($url); // 设置请求头,和Postman一致 $headers = [ 'Content-Type: text/xml; charset=utf-8', 'Accept-Encoding: gzip, deflate', 'SOAPAction: "http://tempuri.org/IPublic/YourSoapMethodName"', // 替换成实际的SOAPAction值 'Content-Length: ' . strlen($soapBody) ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $soapBody); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 若需要忽略SSL证书(如果环境有问题),可以打开下面一行 // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $contentEncoding = curl_getinfo($ch, CURLINFO_CONTENT_ENCODING); curl_close($ch); // 处理gzip压缩响应 if ($contentEncoding === 'gzip') { $response = gzdecode($response); } // 输出可读的XML响应 header('Content-Type: text/xml'); echo $response; ?>
注意事项
- 替换代码中的
YourSoapMethodName为接口实际的SOAP方法名,SOAPAction的值也要和Postman里的完全一致 - 确保
<From>和<To>的内容和Postman中成功请求的完全相同,包括大小写、特殊字符等 - 如果
gzdecode()报错,可能是PHP没有启用zlib扩展,需要在php.ini中开启extension=zlib
内容的提问来源于stack exchange,提问作者ashanrupasinghe
相关产品推荐
相关产品推荐

