PHP中使用cURL调用XML SOAP API无响应,请求协助排查
解决PHP cURL调用SOAP API无响应问题
我帮你排查了代码里的几个关键问题,这应该就是你拿不到响应的核心原因:
1. 错误对SOAP XML做了urlencode()
SOAP API接收的是原始XML文本,你用urlencode($input_xml)会把XML里的<、>、空格等特殊字符转成URL编码格式,服务端根本无法解析这种被转码后的内容,自然不会返回有效响应。
2. Content-Length计算不匹配
你计算的是原$input_xml的长度,但实际发送的是urlencode后的内容,这会导致HTTP头里的Content-Length和实际发送的字节数不一致,服务器可能会直接截断请求或者忽略。
修正后的完整代码
<?php $url='http://test.*******.com:8013/WCAPI.svc'; // 注意:直接使用原始XML字符串,用单引号避免PHP自动转义XML标签 $input_xml='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:wpb="http://schemas.datacontract.org/2004/07/WPBusinessLayer.WPTransactionLayer.WebconnectPlus.Corporate.Agent.User.Proxy"> <soapenv:Header/> <soapenv:Body> <tem:ProcessUserLogin> <tem:ObjCRPUserLoginReq> <wpb:AUI>333</wpb:AUI> <wpb:Password>apitest</wpb:Password> <wpb:SID>CRPUSERLOGIN</wpb:SID> <wpb:UTL>987639</wpb:UTL> <wpb:UserName>apitest</wpb:UserName> </tem:ObjCRPUserLoginReq> </tem:ProcessUserLogin> </soapenv:Body> </soapenv:Envelope>'; $headers = array( 'Content-type: text/xml; charset=utf-8', 'Content-length: '.strlen($input_xml), 'SOAPAction: http://tempuri.org/IWCAPI/ProcessUserLogin' ); $ch= curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_URL, $url); // 去掉urlencode,直接发送原始XML内容 curl_setopt($ch, CURLOPT_POSTFIELDS, $input_xml); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 增加重定向跟随和SSL验证关闭(仅测试环境用,生产环境请开启SSL验证) curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $data = curl_exec($ch); // 新增调试信息:查看HTTP状态码和请求详情,帮助定位问题 $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo "HTTP状态码: {$httpStatus}<br>"; echo "请求详细信息: <pre>".print_r(curl_getinfo($ch), true)."</pre><br>"; if (curl_error($ch)) { echo 'CURL错误信息:' . curl_error($ch); } else { // 用htmlspecialchars转义后输出,避免XML标签被浏览器解析 echo 'API响应内容: <pre>'.htmlspecialchars($data).'</pre>'; } curl_close($ch); ?>
额外排查步骤
如果修正后还是没有正常响应,可以试试这些方法:
- 先用浏览器或者Postman测试目标API地址,确认服务本身是可用的,能返回数据。
- 检查你的PHP服务器是否能访问目标端口(8013),可以用
telnet test.*******.com 8013或者nc -zv test.*******.com 8013命令测试连通性。 - 如果后续API切换为HTTPS,要确保PHP环境配置了正确的CA证书,避免SSL验证失败。
内容的提问来源于stack exchange,提问作者anees ma kader
相关产品推荐
相关产品推荐

