PHP Sabun Müşteri: Nasıl parametresi olarak Türetilmiş sınıf ile WebService diyorsun?

2 Cevap php

PHP 5 kullanıyorum, ve çeşit böyle tanımlanan bir webcoder aramak istediğiniz ediyorum:

webmethod ( AbstractBase obj );

Ben bir SoapClient (wsdl tabanlı) kullanıyorum. Web yöntem subclass AbstractBase arasında bekliyor. Oysa, PHP, sabun yöntemini çağırarak bana bu hatayı alır:

    Server was unable to read request. 
        ---> There is an error in XML document  
        ---> The specified type is abstract: name='AbstractBase'

Ben sorun ben Sabun çağrısında obj parametresinin türünü belirtmek zorunda eminim - ama ben bunu yapmak için sihirli kelimeyi bulmak için görünmüyor olabilir.

    $client = new SoapClient($WSDL, $soapSettings);
    $obj = array(
        'internal_id' => $internalId,
        'external_id' => $externald,
    );
    $params = array(
        'obj'      => $obj  // How do I say it is of type: DerivedClass?
    );

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

2 Cevap

Bu iyi bir öneri oldu, ama o da işe yaramadı. Ama bana doğru yönde gidiş var. Ben, senin fikrini aldı 2 sınıfları oluşturulmuş ve açıkça bir SoapVar ve XSD_ANYTYPE ile nesne türünü ayarlamak için çalıştı. Bu neredeyse çalıştı - ama adını alan sınıfında alanlarda (ns1 :) set vermedi.

SO nasıl Sonunda bu giderdi mi? Bu 2 şey aldı.

Ben harika XSD_ANYXML keşfetti. Bu bana istek için kendi XML rulo sağlar. Kendi başına sabun zarf xsi ad eklemek için başarısız oldu. Yani isteği kuruyordu kodunu uyanmak için bir XSD_STRING olmak için bir parametre zorlamak zorunda kaldı. Benim çalışma kodu:

$client = new SoapClient($WSDL, $soapSettings);
$myXml = "
  <ns1:obj xsi:type='ns1:DerivedClass'>
    <ns1:internal_id>$internalId</ns1:internal_id>
    <ns1:external_id>$externalId</ns1:external_id>
  </ns1:obj>
";

$params = array(
    // this is needed to force the XSI namespace in the header (there must be a better way)
    'foo' => new SoapVar('bar', XSD_STRING, 'String, 'http://www.w3.org/2001/XMLSchema-instance'),
    // this uses the XML I created
    'obj' => new SoapVar($myXml, XSD_ANYXML),
);

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

(Yerine bir nesnenin) geçiyoruz dizi yere AbstractBase dökülür ediliyor ve hata sonra atılan merak ediyorum. Bunun yerine gerçek bir nesne geçmek gerekebilir:

abstract class AbstractBase {
    public $internal_id;
    public $external_id;
}

class DerivedClass extends AbstractBase { }

$obj = new DerivedClass();
$obj->internal_id = $internalId;
$obj->external_id = $externalId;

$params = array(
   'obj'      => $obj  // Now an instance of DerivedClass
);

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