SABUN-HATA: Kodlama: kodlama kurallarının ihlali?

5 Cevap php

Beyler, ben son birkaç saat boyunca masadan başımı beceriyor, şaşırıp.

Ben bir hizmet tüketmek çalışıyorum, ve ben bu bir doğada hemen hemen aynıdır diyorsun 8 diğer işlevleri var, ama bu bir, bir de sonuç 'soap-HATA: Kodlama: kodlama kurallarının ihlali' hata.

İşte işlev çağrısı (güvenlik için atlanmış wsdl):

    function CanLoadProduct($data){

	$client = new SoapClient('wsdl-url');

	$params = array('username'	 => $this->username,
					'password'	=> $this->password,
					'prod'		=> $data['productid'],
					'mdn'		=> $data['mdn']);

	try {
		$reply = $client->__soapCall("CanLoadProduct", $params);
	} catch (Exception $e) {
		echo 'Error: ',  $e->getMessage(), "\n";
		print_r($params);
		die();
	}

	if( $reply['result'] == 1 ){
		return TRUE;		// 1 = true
	} else {
		return FALSE;
	}

}

Ok so this function, connects to a webservice, the required elements are: username, password, prod, mdn, all 4 of which I supply as part of the $params array. Username/Pass are defined earlier, and do work fine, as the other 8 functions consume the web service without any problems.

The $data[] array (that I pass to the function), contains: $data['productid'] $data['mdn'] nothing else is used.

Ben alıyorum

SOAP-ERROR: Encoding: Violation of encoding rules

bazı açıklanamayan bir nedenle, ve bu hatayı google'da hiçbir yerde beni alır. Başkasının bu çalıştırmak? PHP 5.2.9-2 Koşu. Tuhaf şey, bu% 100 çalışıyor bu işlevi özdeştir:

    function GetPIN($productid){

	$client = new SoapClient('wsdl-url');

	$params = array('username'	=> $this->username,
					'password'	=> $this->password,
					'prod'		=> $productid);

	try {
		$reply = $client->__soapCall("GetPIN", $params);
	} catch (Exception $e) {
		echo 'Error: ',  $e->getMessage(), "\n";
		die();
	}
		return $reply;
}

İşte WSDL (bu ilk yayınlanmıştır olmalıdır):

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    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/" 
    xmlns:tns="ready:test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="ready:test">
<types>
<xsd:schema targetNamespace="ready:test"
>
 <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
 <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
</xsd:schema>
</types>
<message name="CanLoadProductRequest">
  <part name="username" type="xsd:string" />
  <part name="password" type="xsd:string" />
  <part name="prod" type="xsd:string" />    
  <part name="mdn" type="xsd:string" />
  <part name="esn" type="xsd:string" /></message>
<message name="CanLoadProductResponse">
  <part name="result" type="xsd:int" /></message>
<portType name="CanLoadProductPortType">
  <operation name="CanLoadProduct">
    <input message="tns:CanLoadProductRequest"/>
    <output message="tns:CanLoadProductResponse"/>
  </operation>
</portType>

<binding name="CanLoadProductBinding" type="tns:CanLoadProductPortType">
  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="CanLoadProduct">
    <soap:operation soapAction="{url-removed}" style="rpc"/>
    <input>
        <soap:body use="encoded" namespace="" 
           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </input>
    <output>
        <soap:body use="encoded" namespace="" 
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </output>
  </operation>
</binding>
<service name="CanLoadProduct">
  <port name="CanLoadProductPort" binding="tns:CanLoadProductBinding">

    <soap:address location="{url-removed}"/>
  </port>
</service>
</definitions>

5 Cevap

Eğer bir yerde bir tür uyuşmazlığı var gibi İsteğiniz montaj sırasında (parametrelerden biri dize türünde değil) ya görünüyor, ya da sunucu bir int dışında bir şey (WSDL yanıt tanımını ihlal döner ve böylece müşteri dikkate neden yanıt) o başka bir şey beklediği gibi, geçersiz.

  • İlk davayı sınamak için, ilk dizesi tüm parametreleri döküm sağlamak
  • İkinci durumda test etmek için, $ client-> __getLastResponse () sonradan aracılığıyla sunucudan gerçek XML cevap erişmek için ayarlamak true trace seçeneği ile SoapClient oluşturmak (Bunu için bu kullanabilirsiniz istek ayıklama da __ getLastRequest yoluyla ()).

Bazı ek gözlemler / sorular:

  • Yayınlanan WSDL göre, 'CanLoadProductRequest' Eğer işlev çağrısında kaynağı yok beşinci Param 'ESN' vardır.
  • Eğer $client->__soapCall("CanLoadProduct", $params) yerine kullanmak herhangi bir neden $client->CanLoadProduct($username, $password, etc.)? (Ilk versiyon non_WSDL senaryoları için kullanılması amaçlanan bir alt düzey çeşididir. Ikinci versiyonu size daha ayrıntılı bir hata / istisna verebilir)
  • Eğer bazı başka yollarla CanLoadProductRequest için SOAP Çağrı test edebilir miyim? Hata WSDL tanımını sığmayan bir sonuç türü dönmeye çalışırken, sunucu tarafında olabilir.

Ben aynı problem vardı.

SoapUI tercihlerinde Ben Editör Ayarları → Validate Yanıtları → seçenek Tercihleri ​​kontrol ve ben bu bilgileri aldım:

hat 3027: Geçersiz ondalık değeri: beklenmeyen karakter '44 '.

Bu benim sorunum çözüldü. Alan yanlış türü değeri içerdi.

Ben aynı sorunu vardı ve ben bu sözdizimini kullanarak çözüldü __soapCall:

...
$params = new SoapParam($data, 'parameters');

$response = $this->__soapCall('methodName', 
    array(new SoapVar($data, XSD_ANYTYPE, 'parameters'))
  );        
...

Yerine

__soapCall('methodName', array($params)

Yanlış bir tür geri istemciye uygun bir SoapFault vermek için oda bırakır PHP hata bir tür de var.

http://bugs.php.net/bug.php?id=50547

Ben gerçek test verileri ile yanıt reformasyon ve sadece kadar, SoapUI aracını kullanarak bu hatayı alıyorum '?'. Ayrıca SoapUI ile, yanıt beklenenden daha fazla olabilir ve birden fazla isteğe bağlı cevap parametreleri kaldırarak değeri ile beklenen cevap kısaltmak gerekebilir. Umarım bu yardımcı olur?