PHP SOAP uzantısı ile soap isteği parametre isimlerini almak?

1 Cevap php

Aşağıdaki client.php bu isteği XML oluşturur göz önüne alındığında:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://soap.dev/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns1:Test>
      <RequestId xsi:type="xsd:int">1</RequestId>
      <PartnerId xsi:type="xsd:int">99</PartnerId>
    </ns1:Test>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Nasıl parametrelerin isimleri girebilirim? Bir server.php içinde (RequestId ve PartnerID)? Isimleri yükü içinde açık bir şekilde vardır, ancak, sunucu tarafında yalnızca değerleri (1 ve 99) alınan

Örnek kod aşağıdaki gibidir:

client.php

<?php
$client_params = array(
    'location' => 'http://soap.dev/server.php',
    'uri' => 'http://soap.dev/',
    'trace' => 1
);

$client = new SoapClient(null, $client_params);

try {
    $res = $client->Test(
        new SoapParam(1, 'RequestId'),
        new SoapParam(99, 'PartnerId')
    );

} catch (Exception $Ex) {
    print $Ex->getMessage();
}

var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());

server.php

class receiver {
    public function __call ($name, $params)
    {
        $args = func_get_args();
        // here $params equals to array(1, 99)
        // I want the names as well.
        return var_export($args, 1);
    }

}

$server_options = array('uri' => 'http://soap.dev/');
$server = new SoapServer(null, $server_options);
$server->setClass('receiver');
$server->handle();

Gerçekten gelen istek formatını değiştiremezsiniz unutmayın.

Ayrıca, ben $RequestId ve $PartnerId parametreleri ile bir test işlevi oluşturarak geri parametreler isimlerini verebilir farkındayım.

Ama ben gerçekten ne istiyorum gelen isteğin dışında ad / değer çiftlerini elde etmektir.

Şimdiye kadar ben sadece fikir basitçe XML Ayrıştırma ve bu doğru olamaz.

1 Cevap

Geri parametrelere isim vermek ($ RequestId ve $ PartnerID) adlı parametreleri ile test fonksiyonu - Ben nihayet proxy fonksiyon fikri ile gitmeye karar verdi bu sorun vardı geri ne zaman. Onun yeterli bir çözüm, ama kesinlikle iyi değil.

Henüz olsa daha iyi bir çözüm bulmak için umudumuzu kaybetmedik, ve burada benim iyi fikir şimdiye kadar

<?php
class Receiver {

    private $data;

    public function Test ()
    {
        return var_export($this->data, 1);
    }

    public function int ($xml)
    {
        // receives the following string
        // <PartnerId xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:int">99</PartnerId>
        $element = simplexml_load_string($xml);
        $this->data[$element->getName()] = (string)$element;
    } 

}

$Receiver = new Receiver();

$int = array( 
    'type_name' => 'int'
    , 'type_ns' => 'http://www.w3.org/2001/XMLSchema'
    , 'from_xml' => array($Receiver, 'int')
);


$server_options = array('uri' => 'http://www.w3.org/2001/XMLSchema', 'typemap' => array($int), 'actor' => 'http://www.w3.org/2001/XMLSchema');
$server = new SoapServer(null, $server_options);
$server->setObject($Receiver);
$server->handle();

Hala elle XML ayrıştırma anlamına gelir, ama biraz daha aklı başında olduğunu bir anda bir eleman tüm gelen SOAP mesaj ayrıştırma.