【问题标题】:Parse SOAP request php解析 SOAP 请求 php
【发布时间】:2013-11-18 05:44:52
【问题描述】:

我是网络服务的新手,想学习它。 请让我知道在肥皂服务器上解析肥皂请求的最佳和最简单的方法。我的网络服务工作正常,但我有以下问题:

  1. 我无法从肥皂请求中获取值。我尝试了 DOMDocument 以及 simplexml_load_file。但我什么也得不到。我的意思是,客户端正在发送soap请求,但我无法解析它以进行处理。

  2. 我无法测试我的函数在服务器上的运行情况。我从soap客户端发送一个请求,无论我打印什么,服务器上的var_dump都不起作用,我只能看到返回值或客户端异常。我需要将请求肥皂放入数组并处理它并保存到数据库并返回响应。我试图打印/查看/查看客户请求,但失败了。我需要将其视为数组以循环并保存到 DB。

请帮忙。

SOAP 服务器:

<?php
ini_set("soap.wsdl_cache_enabled","0");

$server = new SoapServer("my.wsdl");

function hello($params){
    $response = array(
        "output1" => "requestOutputOne",
        "output2" => "requestOutputTwo"
    );
    return $response;

}

$server->addFunction('hello');
$server->handle();

?>

SOAP 客户端:

<?php

ini_set('display_errors', 1);
ini_set("soap.wsdl_cache_enabled","0");

    try 
    {            
        $client = new SoapClient("my.wsdl", array('trace' => 1));

        $params = array(
            "input1"=>"requestInputOne",
            "input2"=>"requestInputTwo"
        );

        $response = $client->hello($params);

        header("Content-Type: text/xml");


        echo $client->__getLastResponse();

    } 
    catch (SoapFault $e) {
        echo '<pre>'; print_r($e); echo '</pre>';
    }

 ?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<input>
<item>
    <key>input1</key>
    <value>requestInputOne</value>
</item>
<item>
    <key>input2</key>
    <value>requestInputTwo</value>
</item>
</input>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

【问题讨论】:

  • 我们可以看看你的代码吗
  • @Satya 如果可以,请提供帮助。我粘贴了我的代码。我正在返回简单的响应数组,但我想处理请求 $params。如何读取该肥皂请求并保存到数据库

标签: php xml parsing soap xml-parsing


【解决方案1】:

试试这个:

$response = $client->hello($params);

$p=objectToArray($response);
recurse($p);
}

function objectToArray( $object )
    {
        if( !is_object( $object ) && !is_array( $object ) )
        {
            return $object;
        }
        if( is_object( $object ) )
        {
            $object = get_object_vars( $object );
        }
        return array_map( 'objectToArray', $object );
    }

function recurse ($array)
{
    //statements
    foreach ($array as $key => $value)
    {
        # code...
        if( is_array( $value ) )
        {   
          recurse( $value );
        }
        else
        {   $v=$value;
            $v=str_replace("&rsquo;",'\'',strip_tags($v));
            $v=str_replace("&ndash;",'-',$v);
            $v=str_replace("&lsquo;",'\'',strip_tags($v));
            $v=str_replace("&ldquo;",'"',strip_tags($v));
            $v=str_replace("&rdquo;",'"',strip_tags($v));
            $v=str_replace("&#8211;",'-',strip_tags($v));
            $v=str_replace("&#8217;",'\'',strip_tags($v));
            $v=str_replace("&#39;",'\'',strip_tags($v));
            $v=str_replace("&nbsp;",'',strip_tags($v));
            $v=html_entity_decode($v);
            $v=str_replace("&",' and ',$v);
        $v = ereg_replace("\r\n", "", $v);
            $v = ereg_replace("\r", "", $v);

            $v = ereg_replace("\t", "", $v);
        $v =  preg_replace('/\s+/', ' ', $v);
              echo '<'.$key .'>'. trim($v)  .'</'.$key.'>';
        }
  }

使用它,您将拥有所有可用于插入数据库的键和值

【讨论】:

  • 对不起,这不起作用。请查看上面的肥皂请求。这是发送到服务器的内容。我需要处理它。
【解决方案2】:

我自己终于得到了答案:

$xml = $params->item;
$result = array();

foreach ($xml as $item)
{
    $result[$item->key] = $item->value;

}

这会构建一个新数组,其中包含来自soap xml 的所有key=>value。该函数在上面的SoapServer中用于处理Soapclient发送过来的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多