从PHP SOAP服务器获取接收到的XML

12

我正在使用Symfony2应用程序中内置的SOAP服务器,并且除了处理StdClass-Object外,我还需要读取完整的收到的XML以进行调试和日志记录。是否有一种方法可以简单地捕获传输的XML?它应该在请求头中的某个地方,但我无法找到它。


可能是如何查看PHP SOAP客户端类生成的实际XML?的重复问题。 - Gordon
而对于SOAP服务器:http://www.php.net/manual/zh/soapserver.handle.php - Gordon
我不明白 handle 函数如何帮助我接收原始的 XML 数据? - Sgoettschkes
“soap_request” - SOAP请求。如果省略此参数,则假定请求在HTTP请求的原始POST数据中。 - Gordon
好的,你建议我直接从原始的http post中读取xml吗?奇怪的是,soap服务器正在工作,但我无法获取任何POST或GET数据;两者似乎都是空的。你有任何想法xml请求可以存储在哪里吗?我尝试了所有变量,但我无法捕获任何相关数据。 - Sgoettschkes
好的,它们应该在soap_request或$_POST中。如果它们不在那里,请尝试使用XDebug逐步执行过程以找到它们。 - Gordon
2个回答

23

太棒了!这正是我所需要的! - Christopher Pelayo
谢谢!那正是我需要的! - Vladislav Mosalski
非常棒的答案,对我非常有帮助。谢谢。 - HomerPlata

2

SOAP信封中传输的原始XML应该在POST请求体中。在Symfony应用程序中,您可以通过创建一个Request对象并调用其getContents()方法来获取POST请求的主体。

在控制器中

您可以轻松地在控制器中获取请求内容,如下所示:

// src/MyProject/MyBundle/Controller/MyController.php
use Symfony\Component\HttpFoundation\Request;

...

$request = Request::createFromGlobals();
$soapEnvelope = $request->getContents();

在服务内部

Symfony 2.4+的最佳实践是将RequestStack注入到您的服务类中。您可以将其作为构造函数参数,通过调用setter方法等方式来实现。以下是一个快速示例,使用构造函数进行注入。

在您的服务容器中:

// src/MyProject/MyBundle/Resources/config/services.xml
<service id="my.service" class="MyServiceClass">
    <argument type="service" id="request_stack" />
</service>

然后在你的服务类中:

// src/MyProject/MyBundle/Service/MyService.php
use Symfony\Component\HttpFoundation\RequestStack;

....

class MyServiceClass
{
    /**
     * @var RequestStack $rs
     */
    private $requestStack;

    /**
     * Constructor
     *
     * @param RequestStack $requestStack
     */
    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    /**
     * Some method where you need to access the raw SOAP xml
     */
    public function myMethod()
    {
        $request = $this->requestStack->getCurrentRequest();
        $soapEnvelope = $request->getContents();
    }
}

参考文档:

http://symfony.com/blog/new-in-symfony-2-4-the-request-stack

这篇文档介绍了Symfony 2.4中的新功能——请求堆栈。它允许您轻松地在应用程序的不同部分之间共享请求信息,例如请求方法,URI和请求参数。此外,它还可以帮助您更好地管理子请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接