【问题标题】:Get received XML from PHP SOAP Server从 PHP SOAP 服务器获取接收到的 XML
【发布时间】:2011-08-01 07:10:20
【问题描述】:

我在 symfony2 应用程序中使用内置 SOAP-Server,除了处理 StdClass-Object 之外,我还需要阅读接收到的完整 xml 以进行调试和记录。有没有办法简单地捕获传输的 xml?它应该在请求标头中的某个地方,但我根本找不到它。

【问题讨论】:

  • 对于 SOAP 服务器:php.net/manual/en/soapserver.handle.php
  • 我没有看到句柄函数如何帮助我接收原始 xml?
  • 引用:soap_request- SOAP 请求。如果省略此参数,则假定请求位于 HTTP 请求的原始 POST 数据中。
  • 好的,所以你建议我从原始 http 帖子中阅读 xml direkt?奇怪的是,soap 服务器正在工作,但我无法获得任何 POST 或 GET 数据;两者似乎都是空的。你知道xml请求可以存储在哪里吗?我尝试了所有变量,但无法捕获任何相关数据。

标签: php soap symfony


【解决方案1】:

我一直在寻找同样的东西,终于找到了。希望这对您或其他人有所帮助。

$postdata = file_get_contents("php://input");

$postdata 变量将具有原始 XML。通过以下两个链接找到:

http://php.net/manual/en/reserved.variables.httprawpostdata.php

http://php.net/manual/en/soapserver.soapserver.php

【讨论】:

  • 太棒了!这也正是我真正需要的!
  • 谢谢!这就是我需要的!
  • 精湛的答案,对我很有帮助。谢谢。
【解决方案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

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多