Re: [SOAP] Cannot find encoding
[email protected] (Finn Gruwier Larsen) Mon, 09 May 2011 14:56:41 +0200
| Newsgroups | php.soap |
|---|---|
| Message-ID | <[email protected]> |
Den 09-05-2011 14:27, Richard Quadling skrev: > On 9 May 2011 12:50, Finn Gruwier Larsen<[email protected]> wrote: >> Den 09-05-2011 13:08, Richard Quadling skrev: >>> >>> On 9 May 2011 11:48, Richard Quadling<[email protected]> wrote: >>>> >>>> On 9 May 2011 11:26, Finn Gruwier Larsen<[email protected]> wrote: >>>>> >>>>> Den 09-05-2011 12:14, Richard Quadling skrev: >>>>>> >>>>>> On 9 May 2011 11:12, Finn Gruwier Larsen<[email protected]> wrote: >>>>>>> >>>>>>> Den 09-05-2011 12:01, Richard Quadling skrev: >>>>>>>> >>>>>>>> On 9 May 2011 09:52, Finn Gruwier Larsen<[email protected]> wrote: >>>>>>>>> >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> I am trying to get a SOAP request working. At this line in my code: >>>>>>>>> >>>>>>>>> $info = $soapClient->__call("getLegalUnit", array($ap_param)); >>>>>>>>> >>>>>>>>> I get this error: >>>>>>>>> >>>>>>>>> PHP Fatal error: SOAP-ERROR: Encoding: Cannot find encoding >>>>>>>>> in<file> >>>>>>>>> <line >>>>>>>>> no>. >>>>>>>>> >>>>>>>>> What does "encoding" mean in this context, and how do I specify it? >>>>>>>>> >>>>>>>>> Best regards, >>>>>>>>> >>>>>>>>> Finn >>>>>>>>> >>>>>>>>> -- >>>>>>>>> PHP Soap Mailing List (http://www.php.net/) >>>>>>>>> To unsubscribe, visit: http://www.php.net/unsub.php >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> What parameters do you pass to the SOAPClient constructor? >>>>>>>> >>>>>>>> http://docs.php.net/manual/en/soapclient.soapclient.php >>>>>>>> >>>>>>>> "The encoding option defines internal character encoding. This option >>>>>>>> does not change the encoding of SOAP requests (it is always utf-8), >>>>>>>> but converts strings into it." >>>>>>>> >>>>>>>> I use these options (amongst others) ... >>>>>>>> >>>>>>>> 'encoding' => >>>>>>>> 'ISO-8859-1', >>>>>>>> 'exception' => >>>>>>>> True, >>>>>>>> 'trace' => >>>>>>>> True, >>>>>>>> >>>>>>>> Richard. >>>>>>>> >>>>>>> >>>>>>> I only passed the "trace => True" parameter. >>>>>>> >>>>>>> Passing the extra parameters above does not change anything. I also >>>>>>> tried >>>>>>> "encoding => 'UTF-8'" with same result. >>>>>>> >>>>>>> Finn >>>>>>> >>>>>> >>>>>> Can you show more code? >>>>>> >>>>> >>>>> Sure. >>>>> >>>>> <?php >>>>> // Create private key: >>>>> $privateKey = openssl_pkey_new(); >>>>> >>>>> // Create certificate signing request: >>>>> $csr = openssl_csr_new(array('http://...'), $privateKey); >>>>> >>>>> // Get public key: >>>>> $publicKey = openssl_csr_get_public_key($csr); >>>>> // print_r(openssl_pkey_get_details($publicKey)); >>>>> >>>>> // Create SOAP client: >>>>> $params = array( >>>>> 'trace' => True, >>>>> 'encoding' => 'UTF-8', >>>>> 'exception' => True); >>>>> $soapClient = new SoapClient("LegalUnitGet_20080401.wsdl", $params); >>>>> >>>>> $ns = 'http://...'; >>>>> >>>>> // Prepare SoapHeader parameters >>>>> $sh_param = array( >>>>> 'PrivateKey' => $privateKey, >>>>> 'PublicKey' => $publicKey); >>>>> $headers = new SoapHeader('http://...', 'Security', $sh_param); >>>>> >>>>> // Prepare Soap Client >>>>> $soapClient->__setSoapHeaders(array($headers)); >>>>> >>>>> // Setup the RemoteFunction parameters >>>>> $ap_param = array( >>>>> 'LegalUnitIdentifier' => 'xxxxxx', >>>>> 'UserId' => 'xxxxx', >>>>> 'Password' => 'xxxxx'); >>>>> >>>>> $info = $soapClient->__getFunctions(); >>>>> print_r($info); >>>>> >>>>> // Call Remote Function () >>>>> $error = 0; >>>>> try { >>>>> $info = $soapClient->__soapCall("getLegalUnit", array($ap_param)); >>>>> } catch (SoapFault $fault) { >>>>> $error = 1; >>>>> print("Faultcode: ".$fault->faultcode)."\n"; >>>>> print("Faultstring: ".$fault->faultstring); >>>>> } >>>>> >>>>> -- >>>>> >>>>> Finn >>>>> >>>> >>>> Is the file and line in the file you've shown? As you are using Soap >>>> faults, is it possible that this is a server side error coming across >>>> in the soap fault? >>>> -- >>>> Richard Quadling >>>> Twitter : EE : Zend >>>> @RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY >>>> >>> >>> In looking at the possible cause of the error. The error is caused by >>> a failure in a hash lookup in the function get_conversion() >>> (php_encoding.c) >>> >>> In tracking that back to the callee for the function, the sort of >>> calls being made are NOT to do with character encoding, but type >>> encoding. >>> >>> e.g. >>> >>> Windows Grep Search Results >>> 'get_conversion' in *.*: 33 matches in 5 files. 677 files searched. 0 >>> files skipped. >>> >>> Plain | File contents ü | File names ü | Line numbers ü | Whole line ü >>> | Word wrap | Fixed Font | Match window: +/- 0ü | 1 | 2 | 3 | 4 | 5 >>> lines >>> >>> D:\BuildPHP\php53dev\vc9\x86\PHP_5_3\ext\soap\php_encoding.c >>> 00403: enc = get_conversion(Z_LVAL_P(*ztype)); >>> 00471: encode = get_conversion(UNKNOWN_TYPE); >>> 00561: encode = get_conversion(UNKNOWN_TYPE); >>> 01277: zval* val = master_to_zval(get_conversion(XSD_ANYXML), node); >>> 01296: zval* val2 = master_to_zval(get_conversion(XSD_ANYXML), >>> node->next); >>> 01767: enc = get_conversion(XSD_ANYXML); >>> 02042: property = master_to_xml(get_conversion((*zprop)->type), >>> (*zprop), style, xmlParam); >>> 02075: enc = get_conversion(APACHE_MAP); >>> 02077: enc = get_conversion(SOAP_ENC_ARRAY); >>> 02081: enc = get_conversion(IS_NULL); >>> 02204: xparam = master_to_xml(get_conversion((*zdata)->type), >>> (*zdata), style, xmlParam); >>> 02805: xparam = master_to_xml(get_conversion((*temp_data)->type), >>> (*temp_data), style, item); >>> 02868: enc = get_conversion(data->type); >>> 02870: enc = get_conversion(IS_NULL); >>> 02892: enc = get_conversion(IS_NULL); >>> 02894: enc = get_conversion(IS_NULL); >>> 02926: enc = get_conversion(SOAP_ENC_ARRAY); >>> 02928: enc = get_conversion(XSD_STRING); >>> 02932: enc = get_conversion(SOAP_ENC_OBJECT); >>> 03223: encodePtr enc = get_conversion(XSD_ANYXML); >>> 03581: encodePtr get_conversion(int encode) >>> 03621: return get_conversion(XSD_ANYTYPE); >>> 03683: return get_conversion(XSD_ANYTYPE); >>> 03707: enc = get_conversion(cur_type); >>> >>> D:\BuildPHP\php53dev\vc9\x86\PHP_5_3\ext\soap\php_encoding.h >>> 00208: encodePtr get_conversion(int encode); >>> >>> D:\BuildPHP\php53dev\vc9\x86\PHP_5_3\ext\soap\php_packet_soap.c >>> 00194: zval *zv = master_to_zval(get_conversion(IS_STRING), tmp); >>> 00201: zval *zv = master_to_zval(get_conversion(IS_STRING), tmp); >>> 00224: zval *zv = master_to_zval(get_conversion(IS_STRING), tmp); >>> >>> D:\BuildPHP\php53dev\vc9\x86\PHP_5_3\ext\soap\php_schema.c >>> 02210: type->encode = get_conversion(XSD_ANYXML); >>> >>> D:\BuildPHP\php53dev\vc9\x86\PHP_5_3\ext\soap\soap.c >>> 01137: enc = get_conversion(UNKNOWN_TYPE); >>> 04130: xmlNodePtr node = master_to_xml(get_conversion(IS_STRING), >>> *tmp, SOAP_LITERAL, param); >>> 04134: xmlNodePtr node = master_to_xml(get_conversion(IS_STRING), >>> *tmp, SOAP_LITERAL, param); >>> 04156: node = master_to_xml(get_conversion(IS_STRING), *tmp, >>> SOAP_LITERAL, node); >>> >>> >>> So, it looks more like the client is sending a type that no map exists >>> for. >>> >>> At a guess. >>> >>> Can you provide the URL for the wsdl file? >> >> http://archprod.service.eogs.dk/cvronline/metacvronline/LegalUnitGet_20080401.wsdl >> >> Finn >> >> > > I think the params are incorrect. > > public function getLegalUnit(GetLegalUnitRequestType $getRequest) > > class GetLegalUnitRequestType { > public $LegalUnitIdentifier; // LegalUnitIdentifierType > public $level; // LevelType > } > > class LegalUnitIdentifierType { > } > > class LevelType { > } > > The complex types of LegalUnitIdentifierType and LevelType don't seem > to be right for wsdl2php (the class builder I use - sourceforge). > > Using the array method, then maybe ... array('LegalUnitIdentifierType' > => 'xxx', 'Level' => nnn) may be a better. > > The wsdl2php isn't perfect and doesn't seem to handle the external xsds. > > > That is definately a possibility. Thanks for looking into it. Finn