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