php soap header setenv正确

时间:2010-11-18 15:19:40

标签: php soap

好的,我的wsdl服务器期待这个作为一个电话:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:esc="http://escoles.webservice.jovtitus.dasc.gencat.net" xmlns:impl="http://impl.escoles.webservice.jovtitus.dasc.gencat.net">
    <soapenv:Header/>
    <soapenv:Body>
       <esc:login>
          <esc:in0>
             <!--Optional:-->
             <impl:password>++</impl:password>
             <!--Optional:-->
             <impl:user>++</impl:user>
          </esc:in0>
       </esc:login>
    </soapenv:Body>
 </soapenv:Envelope>

但我的php soap调用与此相同:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://escoles.webservice.jovtitus.dasc.gencat.net">
<SOAP-ENV:Body>
<ns1:login>
<ns1:in0>
<password>+++</password>
<user>+++</user>
</ns1:in0>
</ns1:login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> 

实际上是一样的,但我发现有些命名空间我的php没有应用。为什么? 我的ns1:必须是esc:,而且必须是impl:

任何人都可以帮助我吗?

我正在使用我正在使用的PHP代码:

$login = "+++++++";
$password = "+++++++++";

$enllaç = "http://preproduccio.www14.gencat.cat/jov_titus/AppJava/services/EscolesWebService";
$impl   = 'http://impl.escoles.webservice.jovtitus.dasc.gencat.net';
$esc    = 'escoles.webservice.jovtitus.dasc.gencat.net';

$aOptions = array( "uri"=> $esc, 'location' => $enllaç,'trace'=>1 );

class loginRequest {
    private $password;
    private $user;

    public function __construct($password, $user)
    {
        $this->password     =   $password;
        $this->user         =   $user;
    }
}

$x = new loginRequest($password, $login);
$param = array('in0' => $x);


try {
    $client = new SoapClient($enllaç.'?wsdl', $aOptions);
    $clau = new SoapVar($param, SOAP_ENC_OBJECT, null, 'http://impl.escoles.webservice.jovtitus.dasc.gencat.net'); 
    $result = $client->login($clau);
    echo "REQUEST:\n" .htmlentities($client->__getLastRequest()). "<br /><br />";
} catch (SoapFault $fault) {
    trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}

1 个答案:

答案 0 :(得分:0)

就ns1:和esc:而言,没有问题。

ns1:和esc:是名称空间的前缀。在根元素中,您为给定的命名空间指定前缀,稍后在元素中通过指定的前缀引用属于该命名空间的元素。

例如,在您的服务器预期调用根元素中,命名空间http://escoles.webservice.jovtitus.dasc.gencat.net被赋予前缀esc。所以元素esc:login被解析为在那个命名空间中。

在PHP生成的调用中,名称空间http://escoles.webservice.jovtitus.dasc.gencat.net被赋予前缀ns1。所以元素ns1:login在同一个命名空间中解析,这很好。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://escoles.webservice.jovtitus.dasc.gencat.net"> 

如果你看一下根元素Envelope xmlns:SOAP-ENV =“http://schemas.xmlsoap.org/soap/envelope/”----&gt;此行将SOAP-ENV前缀分配给http://schemas.xmlsoap.org/soap/envelope/命名空间。

所以SOAP-ENV:Envelope元素解析为http://schemas.xmlsoap.org/soap/envelope/命名空间

PHP调用中唯一缺少的是http://impl.escoles.webservice.jovtitus.dasc.gencat.net

的名称空间声明

您能否提供映射的详细信息 - 在PHP SOAP调用中需要一些映射来获取此命名空间。您正在使用的PHP SOAP库以及用于生成SOAP调用的内容的详细信息 - 通常您使用一些序列化程序将PHP对象转换为SOAP元素