强制 PHP SoapClient 使用 HTTP GET 请求

Force PHP SoapClient to use HTTP GET request

我必须与只接受 http GET 请求的 SOAP 服务器交互(使用 POST 会导致 'bad-request' 错误)。

我无法在文档 PHP 文档中找到任何关于如何做到这一点的内容,所以我试图使用 stream_context [=] 设置请求 header

$soap_client = new SoapClient($wsdl,
        array(
            "trace" => $trace,
            "exceptions" => $exceptions,
            'proxy_host' => $proxyHost,
            "proxy_port" => $proxyPort,
            "soap_version" => SOAP_1_2,
            'stream_context' => stream_context_create(array('http' => array("header" => "request: GET")))
            ));

没有成功。有谁知道我如何在使用 SoapClient 时强制执行 http get 请求?

我做了一些研究,我发现 GET 请求是在 SOAP 1.2 中引入的,但通常 SOAP 不支持 GET 请求,而 REST 支持。

我认为在某些情况下可能有解决方法。这不是直接的解决方案,因为没有那么多问题。

SOAP 正在通过 POST 发送数据。在 GET 请求中,您只能使用 URL 并将任何参数包装到变量中,例如

http://server.domain/path/file.php?var1=value1&var2=value2&etc=etc

所以如果SOAP只接受GET,这很奇怪,但是如果你知道,你可以在变量xml中传递数据你可以尝试通过URL发送:

http://server.domain/path/file.php?xml=encoded_data

如果这是真的(我不确定)那么您可以使用 SOAP 客户端,然后像这里一样转储请求:http://www.herongyang.com/ws/php_soap_2.html

echo("\nDumping request headers:\n" . $client->__getLastRequestHeaders());
echo("\nDumping request:\n" . $client->__getLastRequest());
echo("\nDumping response headers:\n" . $client->__getLastResponseHeaders());
echo("\nDumping response:\n" . $client->__getLastResponse());

然后 "encode" 来自 $client->__getLastRequest() 的 xml,将其传递给 URL 并通过 curl 发送。