SABUN PHP Hata Ayrıştırma?

3 Cevap php

O zaman başarısız olur, ve ben güvenilir üretebileceği bir dava buldum - Ben EJB ile oluşturulan bir SOAP hizmeti ile iletişim kuruyorum.

Ben aşağıda listelenmiştir ne olsun (ve ne benim için geçerli XML gibi görünüyor) son yanıtı alınırken, ancak "biz XML değil var gibi görünüyor" diyen bir korkak eşek soap hatası alıyorum.

Herhangi bir düşünce?

Soap Fault:

object(SoapFault)#2 (9) { 
    ["message:protected"]=>  string(33) "looks like we got no XML document" 
    ["string:private"]=>  string(0) "" 
    ["code:protected"]=>  int(0) 
    ["file:protected"]=>  string(40) "/Users/josh/Sites/blahblahblah/test-update.php" 
    ["line:protected"]=>  int(26) 
    ["trace:private"]=>  array(2) { 
        [0]=>  array(4) { 
            ["function"]=>  string(6) "__call" 
            ["class"]=>  string(10) "SoapClient" 
            ["type"]=>  string(2) "->" 
            ["args"]=>  array(2) { 
                [0]=>  string(24) "UpdateApplicationProfile" 
                [1]=>  array(1) { 
                    [0]=>  array(2) { 
                        ["suid"]=>  string(36) "62eb56ee-45de-4971-9234-54d72bbcd0e4" 
                        ["appid"]=>  string(36) "6be2f269-4ddc-48af-9d47-30b7cf3d0499" 
                    } 
                } 
            } 
        } 
        [1]=>  array(6) { 
            ["file"]=>  string(40) "/Users/josh/Sites/blahblahblah/test-update.php" 
            ["line"]=>  int(26) 
            ["function"]=>  string(24) "UpdateApplicationProfile" 
            ["class"]=>  string(10) "SoapClient" 
            ["type"]=>  string(2) "->" 
            ["args"]=>  array(1) { 
                [0]=>  array(2) { 
                    ["suid"]=>  string(36) "62eb56ee-45de-4971-9234-54d72bbcd0e4" 
                    ["appid"]=>  string(36) "6be2f269-4ddc-48af-9d47-30b7cf3d0499" 
                } 
            } 
        } 
    } 
    ["faultstring"]=>  string(33) "looks like we got no XML document" 
    ["faultcode"]=>  string(6) "Client" 
    ["faultcodens"]=>  string(41) "http://schemas.xmlsoap.org/soap/envelope/" 
}

And the actual raw XML response using client->__getLastResponse():

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
    <env:Header> 
    </env:Header>
    <env:Body>
        <ns2:UpdateApplicationProfileResponse xmlns:ns2="blahblahblah">
            <paramname>status</paramname>
            <paramname>location</paramname>
            <paramname>timezone</paramname>
            <paramname>homepage</paramname>
            <paramname>nickname</paramname>
            <paramname>firstName</paramname>
            <paramname>languages</paramname>
            <paramname>color</paramname>
            <paramname>lastName</paramname>
            <paramname>gender</paramname>
            <paramvalue></paramvalue>
            <paramvalue></paramvalue>
            <paramvalue></paramvalue>
            <paramvalue></paramvalue>
            <paramvalue>XXX XXX</paramvalue>
            <paramvalue>XXX</paramvalue>
            <paramvalue></paramvalue>
            <paramvalue>CA0008</paramvalue>
            <paramvalue>XXX</paramvalue>
            <paramvalue></paramvalue>
        </ns2:UpdateApplicationProfileResponse>
    </env:Body>
</env:Envelope>

3 Cevap

Evet, sorun kötü karakter veri veya ParamValue çocuklarda birinde geçirilen şey bir parça ile ilgisi var bu yüzden. Görünür gibi görünen, ya da hatta iz ve __ getLastRequest () kullanarak, elimden ETMEZ.

Ben ne yazık ki sunucu kodu doğrudan erişim yok. Onun EJB kullanılarak oluşturulan bir WS doğrudan outputted - geliştirici XML kendisi için hiçbir erişimi vardır, bu yüzden hiçbir başıboş boşluk yoktur. Hiç bir boşluk olarak görünmüyor - kesinlikle kullanarak hiçbir boşluk olduğunu __ getLastRequest (), bu SoapClient için php sayfa yorumlarına göre, hatanın nedeni aramak için harika bir yer olsa.

Ben temelde kötü bir çağrı görmezden gelerek sorunu çözdü, ve ben kötü verileri silip böyle, paramnames ve paramvalues ​​her "sıfırlama" ...

Her neyse, ben açıkça neden olduğunu anlamaya olmadığını serseri, ama afet an için durdurdu.

Edit: Solved this since A control character was slipping in to xml returned by the EJB framework. It was supposed to be null, so it used a control character to represent it, and php SOAP barfed because its not "valid" xml. I resolved the problem by writing a manual parse of the response using __getLastRequest() in the case of an exception.

Burada söylemek zor; Kontrol edebileceğiniz şeyler çift:

  • hayır (kesinlikle yok) beyaz boşluk ya başında ya da XML / SOAP veri sonu olduğundan emin olun
  • belki orada standart çıkışına eko bazı hata olabilir (yani, önce / SOAP veri sonra?) olabilir

Tarayıcınızdan webservice URL'sini arama deneyin eğer çıktı ne tür alabilirim?

(It would do much, as you won't be using SOAP but it should say something like "Bad request")

Eğer sunucu tarafında iz her türlü almak mı, bu yararlı olabilir ne olursa olsun bir sorun / / bir hata var oldu gösterebilir misiniz?

Şey, ben web hizmetleri ile çalıştı ve ben neden bulamadım hatalar var geçen zaman bulmak için bir yol hala varsa, ben "sniff" ne ağda devam edildi (şimdi Wireshark denir) eterli kullanarak sona erdi. Bazen olur, ama bunu yaparken nefret ediyorum.

Ben orada bir sorun PHP 5.2.6 ile ve aşağıda bir soap iade zarfı Bug #44882 SOAP extension object decoding bug ayrıştırma zaman boğulmamak için PHP olur düşünüyorum. Ben 5.2.10 ve 5.2.6 üzerinde sessizce başarısız 5.3.5 üzerinde sorunsuz çalışan bazı kodlar var. Bunun yerine, bir özel durum veya return false arasında SoapClient-> methodName (params) sadece sliently boş bir nesne döndürür. Benzer sorunları görüyorsanız son 5.2 veya 5.3 sürümüne güncelleyin.