Bir PHP SoapServer bir PHP Dizisi dönen

3 Cevap php

Ben "hizmet tarafını oluştururken", appologies önceden herhangi bir terminoloji için ben munging ediyorum böylece Sabun nispeten yeni.

Bu PHP'nin SoapServer Sınıfı'nı kullanarak kurulum oldu bir Remote Procedure Sabun Servisinden bir PHP dizi dönmek mümkün mü?

Ben kısmen, böyle bir şey görünüyor ki (körü körüne bir öğretici takip ederek inşa edilmiş) bir WSDL var

<message name='genericString'>
	<part name='Result' type='xsd:string'/>
</message>

<message name='genericObject'>
	<part name='Result' type='xsd:object'/>
</message>

<portType name='FtaPortType'>		
	<operation name='query'>
		<input message='tns:genericString'/>
		<output message='tns:genericObject'/>
	</operation>    	
</portType>

Ben arıyorum PHP yöntem sorgu adında ve bu gibi bir şey görünüyor

public function query($arg){
	$object = new stdClass();
	$object->testing = $arg;
	return $object;		
}

Bu beni aramak için izin verir

$client = new SoapClient("http://example.com/my.wsdl");
$result = $client->query('This is a test');

ve sonuç dökümü gibi bir şey olacaktır

object(stdClass)[2]
	public 'result' => string 'This is a test' (length=18)

Ben sorgu yöntemiyle bir yerli PHP dizi / koleksiyon dönmek istiyorum. Ben bir dizi dönmek için benim sorgu yöntemini değiştirirseniz

public function query($arg) {
	$object = array('test','again');
	return $object;
}

Bu istemci tarafında bir nesnenin içine tefrika ediyor.

object(stdClass)[2]
	public 'item' => 
		array
			0 => string 'test' (length=4)
			1 => string 'again' (length=5)

Bu benim ettik olarak, mantıklı belirli bir xsd:object benim WSDL Sonucu türü olarak. Ben mümkünse, bir nesne sarılmış değil bir doğal PHP dizi dönmek istiyorum. Benim içgüdüleri, belirli bir Xsd var ki: Beni bu başarmak sağlayacak tip, ama ben bilmiyorum. Ben de bir ArrayObject olarak tefrika edildikten nesne razıyım.

Teknik detaylar os WSDL beni okullaşma geri tutmayın. Ben temel kavramları fo bir kavrayışa almak için çalışıyorum

3 Cevap

I this WSDL generator açıklama dosyası oluşturmak için kullanılır.

Dizeler dizisi dönersek benim web hizmeti, burada WSDL parçası yapar ne bir şey:

<wsdl:types>
<xsd:schema targetNamespace="http://schema.example.com">
  <xsd:complexType name="stringArray">
    <xsd:complexContent>
      <xsd:restriction base="SOAP-ENC:Array">
        <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

</wsdl:types>
<message name="notifyRequest">
  <part name="parameters" type="xsd:string" />
</message>
<message name="notifyResponse">
  <part name="notifyReturn" type="tns:stringArray" />
</message>

Sonra API fonksiyonu notify tanımlanır:

<wsdl:operation name="notify">
  <wsdl:input message="tns:notifyRequest" />
  <wsdl:output message="tns:notifyResponse" />
</wsdl:operation>

Alan, neden istemci yanıt alır bir dizi olarak nesne artığını değil?

örneğin

(array) $object;

Bu bir diziye stdClass nesneyi dönüştürür, orada bu hiçbir ölçülebilir havai olduğunu ve O PHP (1) 'dir.

Nesne sabun-enc: Dizi de XSD dan türünü değiştirerek denemek isteyebilirsiniz.

Küçük bir hile - JSON nesneler, geri özyinelemeli birleşmeli diziler içine deşifre olarak kodlamak:

$data = json_decode(json_encode($data), true);