You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:51:57