WordPress向SOAP服务发送XML POST请求无响应问题求助
WordPress向SOAP服务发送XML POST请求无响应问题求助
看起来你已经用ReadyAPI确认了SOAP端点能正常接收数据,但自己写的wp_remote_post和Curl代码都返回空白,这种情况确实挺让人挠头的。我来给你几个实际的排查方向,应该能帮你定位问题:
1. 先加上错误捕获,别让错误“隐身”
你现在的代码完全没做错误处理,空白响应可能是请求过程中出了错,但你没捕获到。
针对wp_remote_post的错误排查:
修改代码,加上WP错误检查和完整响应打印:
$tpn_send = wp_remote_post( $url, array( 'method' => 'POST', 'timeout' => 45, 'redirection' => 5, 'httpversion' => '1.1', // 试试改成HTTP/1.1,很多SOAP服务要求这个 'headers' => $headers, 'body' => $xml_body, 'sslverify' => false ) ); // 检查WP错误 if (is_wp_error($tpn_send)) { echo 'WP请求错误:' . $tpn_send->get_error_message(); } else { // 打印完整响应,包括状态码和响应头 echo '响应状态码:' . $tpn_send['response']['code'] . '<br>'; echo '响应头:<pre>' . print_r($tpn_send['headers'], true) . '</pre>'; echo '响应体:<pre>' . print_r($tpn_send['body'], true) . '</pre>'; }
针对Curl的错误排查:
给Curl加上错误捕获,同时打印详细调试信息:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_body); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 补充SSL相关选项,避免证书验证问题 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 开启详细调试(调试完成后可关闭) curl_setopt($ch, CURLOPT_VERBOSE, true); $verbose = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verbose); $response = curl_exec($ch); // 检查Curl错误 if(curl_errno($ch)){ echo 'Curl错误:' . curl_error($ch); } else { echo '响应状态码:' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . '<br>'; echo '响应体:<pre>' . print_r($response, true) . '</pre>'; } // 打印调试日志 rewind($verbose); $verboseLog = stream_get_contents($verbose); echo 'Curl调试日志:<pre>' . $verboseLog . '</pre>'; curl_close($ch); fclose($verbose);
2. 检查SOAPAction头的格式
很多SOAP服务要求SOAPAction头的值用双引号包裹,你当前的写法可能不符合要求,修改headers数组里的这一行:
"SOAPAction: \"http://foobarMethod\""
3. 去掉手动设置的Content-Length头
手动计算Content-Length很容易出错(比如XML里的特殊字符、编码问题),不如让wp_remote_post或Curl自动处理这个头。直接从$headers数组里删掉这一行试试,大部分服务端会自动识别请求体长度。
4. 对比ReadyAPI的请求和你的代码请求
把ReadyAPI里发送的请求头、请求体和你代码里的$headers、$xml_body逐行对比:
- 确认XML的命名空间、标签结构完全一致,有没有遗漏的闭合标签或拼写错误
- 确认请求头的所有字段(比如Content-Type的参数)和ReadyAPI里的完全匹配
5. 调整HTTP版本
你在wp_remote_post里用的是httpversion => '1.0',但很多SOAP服务要求HTTP/1.1,改成'httpversion' => '1.1'试试。
按照这些步骤排查,应该能找到问题所在——比如可能是SOAPAction头格式不对、XML有语法错误,或者是SSL验证的隐藏问题。
备注:内容来源于stack exchange,提问作者Bastion2
相关产品推荐
相关产品推荐

