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

如何通过PHP发送指定格式的SOAP请求?

使用PHP发送指定SOAP请求的实现方案

没问题,我帮你整理了两种在PHP里发送这个SOAP请求的靠谱方法,都是实际项目里常用的,你可以根据自己的环境来选:

方法一:使用PHP内置SoapClient类(推荐)

这是最简洁的方式,PHP的内置SoapClient已经封装了SOAP协议的大部分细节,只需要构造请求参数即可:

<?php
// 替换为实际的SOAP服务地址和命名空间URL
$soapUrl = '你的SOAP服务地址';
$namespace = 'url'; // 替换为请求里的xmlns对应的实际URL

try {
    // 创建SoapClient实例,设置命名空间和服务地址
    $client = new SoapClient(null, [
        'location' => $soapUrl,
        'uri' => $namespace,
        'trace' => true, // 开启trace方便调试查看请求/响应内容
        'exceptions' => true // 抛出异常方便处理错误
    ]);

    // 构造请求参数,对应你给出的SOAP结构
    $requestParams = [
        'Authentication' => [
            'SubscriberDetails' => [
                'Username' => '你的实际用户名',
                'Password' => '你的实际密码'
            ]
        ],
        'ControlledRequest' => [
            'Asset' => [
                'Name' => 'Tranquility'
                // 这里可以补充你省略的其他字段
            ]
        ]
    ];

    // 调用SOAP方法,注意方法名要和服务端定义的一致(这里是ControlledEnquiryRequest)
    $response = $client->ControlledEnquiryRequest($requestParams);

    // 处理响应结果
    print_r($response);

    // 如果需要调试,可以查看发送的请求内容
    // echo "Request:\n" . $client->__getLastRequest() . "\n";
} catch (SoapFault $e) {
    // 捕获SOAP错误
    echo "SOAP Error: " . $e->getMessage() . "\n";
    // 调试时可以查看错误的请求内容
    // echo "Request:\n" . $client->__getLastRequest() . "\n";
} catch (Exception $e) {
    // 捕获其他异常
    echo "Error: " . $e->getMessage() . "\n";
}
?>

注意事项:

  • 确保你的PHP环境已经启用了soap扩展:可以在php.ini里开启extension=soap,或者通过phpinfo()查看是否加载成功
  • 替换代码中所有的占位符(你的SOAP服务地址、url、你的实际用户名、你的实际密码)为实际值
  • 如果服务端要求HTTPS,可能需要设置SSL相关的上下文参数,比如忽略证书(仅调试用,生产环境不建议):
    'stream_context' => stream_context_create([
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false
        ]
    ])
    

方法二:手动构造HTTP请求(适合特殊场景)

如果SoapClient类无法兼容目标SOAP服务的特殊要求,你可以手动构造完整的SOAP信封并通过HTTP发送:

<?php
// 替换为实际的SOAP服务地址
$soapUrl = '你的SOAP服务地址';

// 构造SOAP信封内容,替换占位符
$soapXml = <<<XML
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sup="url">
    <soapenv:Header/>
    <soapenv:Body>
        <ControlledEnquiryRequest xmlns="url">
            <Authentication>
                <SubscriberDetails>
                    <Username>你的实际用户名</Username>
                    <Password>你的实际密码</Password>
                </SubscriberDetails>
            </Authentication>
            <ControlledRequest>
                <Asset>
                    <Name>Tranquility</Name>
                    <!-- 补充你省略的其他字段 -->
                </Asset>
            </ControlledRequest>
        </ControlledEnquiryRequest>
    </soapenv:Body>
</soapenv:Envelope>
XML;

// 设置HTTP请求头
$headers = [
    'Content-Type: text/xml; charset=utf-8',
    'Content-Length: ' . strlen($soapXml),
    'SOAPAction: ""' // 替换为服务端要求的SOAPAction值,如果有的话
];

// 使用cURL发送请求
$ch = curl_init($soapUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $soapXml);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 调试时可以忽略SSL证书(生产环境禁用)
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$response = curl_exec($ch);
if (curl_errno($ch)) {
    echo "cURL Error: " . curl_error($ch);
} else {
    // 处理响应XML
    print_r($response);
    // 可以用simplexml_load_string解析响应
    // $xmlResponse = simplexml_load_string($response);
}
curl_close($ch);
?>

注意事项:

  • 确保cURL扩展已经启用(大部分PHP环境默认开启)
  • 替换SOAP信封里的占位符和HTTP头中的SOAPAction(如果服务端要求的话)
  • 生产环境下不要禁用SSL证书验证,建议配置正确的CA证书

内容的提问来源于stack exchange,提问作者BN83

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:29:00