4

在 PHP 中,我想知道 SOAP 调用的方法是什么。这是一个示例以了解...

$soapserver = new SoapServer();
$soapserver->setClass('myClass');
$soapserver->handle();

我想知道的是将在 handle() 中执行的方法的名称

谢谢 !!

4

4 回答 4

10

在我看来,在这种情况下访问被调用操作名称的最简洁和最优雅的方法是使用某种WrapperSurrogate设计模式。根据您的意图,您将使用DecoratorProxy

例如,假设我们想在Handler不触及类本身的情况下动态地向我们的对象添加一些附加功能。这允许保持Handler类更清洁,从而更专注于它的直接责任。这样的功能可以是记录方法及其参数或实现某种缓存机制。为此,我们将使用装饰器设计模式。而不是这样做:

class MyHandlerClass
{
    public function operation1($params)
    {
        // does some stuff here
    }

    public function operation2($params)
    {
        // does some other stuff here
    }
}

$soapserver = new SoapServer(null, array('uri' => "http://test-uri/"));
$soapserver->setClass('MyHandlerClass');
$soapserver->handle();

我们将执行以下操作:

class MyHandlerClassDecorator
{
    private $decorated = null;

    public function __construct(MyHandlerClass $decorated)
    {
        $this->decorated = $decorated;
    }

    public function __call($method, $params)
    {
        // do something with the $method and $params

        // then call the real $method
        if (method_exists($this->decorated, $method)) {
            return call_user_func_array(
                array($this->decorated, $method), $params);
        } else {
            throw new BadMethodCallException();
        }
    }
}

$soapserver = new SoapServer(null, array('uri' => "http://test-uri/"));
$soapserver->setObject(new MyHandlerClassDecorator(new MyHandlerClass()));
$soapserver->handle();

如果您想控制对处理程序操作的访问,例如,为了施加访问权限,请使用代理设计模式。

于 2012-05-23T08:08:09.990 回答
1

我知道这是一篇旧帖子,但有人可以利用这个解决方案。应该可以从原始 HTTP POST 数据中提取数据。您不能使用$_POST,因为它是空的,但您可以使用$HTTP_RAW_POST_DATA包含 XML 格式的 SOAP 请求的字符串的预定义变量。

方法名称应该在<soapenv:Body>标签的第一个节点中,如下所示:

<!--
    ...
    XML header, SOAP header etc.
    ...
-->
<soapenv:Body>
   <urn:methodName soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <param1 xsi:type="xsd:string" xs:type="type:string" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">param1 value</param1>
      <param2 xsi:type="xsd:string" xs:type="type:string" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">param2 value</param2>
   </urn:methodName>
</soapenv:Body>
<!--
    ...
-->

您可能可以使用 SimpleXML 之类的东西对其进行解析,或者使用一些正则表达式来获取methodName,但请记住该字符串urn:是在标头中定义的命名空间,因此它可以是任何东西。

于 2014-02-18T13:33:33.520 回答
0

虽然不是最好的方法,但您可以以某种方式使用此http://danpolant.com/use-the-output-buffer-to-debug-a-soap-server/

对于快速且非常肮脏的方法(请仅将其用于一次性调试,而不是在生产代码中使用!):只需在方法主体中为每个 SOAP 方法的名称分配一个全局变量,然后用它做任何你想做的事情SoapServer 完成了它的工作,如上面的链接中所述。像这样的东西(未经测试的代码):

$method = "";
class test
{
    function call1()
    {
        global $method; $method = "call1";
    }
}
ob_start();
$soapserver = new SoapServer();
$soapserver->setClass('test');
$soapserver->handle();

$mystring = ob_get_contents(); // retrieve all output thus far
ob_end_clean ();               // stop buffering
log($mystring);                // log output
log($method);                  // log method
echo $mystring;                // now send it
于 2012-05-22T16:49:39.470 回答
0

通常(但不总是,取决于客户端)$_SERVER['HTTP_SOAPACTION']已设置,您可以从中获取被调用方法的名称。

于 2013-02-04T15:17:28.677 回答