UTF8 Errors in PHP Zend SOAP - php

I am programming a "SOAP Proxy" that connects to a SOAP Server (Main Server) and is a SOAP Server itself. I am programing one Client too that will contact with this SOAP Proxy.
When the SOAP Client call a specific metodh from the SOAP Proxy I receive this error:
SOAP-ERROR: Encoding: string 'Pir\xe4...' is not a valid utf-8 string
I do not know in what language the Main Server is implemented. I am working with PHP in the Proxy Server and in the Client. The information comes from the Main Server and is a complex object.
I found a workaround to the problem. Adding this line before return the content in the Proxy Server eveithyng is ok:
$result = json_decode(utf8_encode(json_encode($result)));
But, i think this is quinte ninja function to do. There are a better way? Anyone found this kind of problem in the past? Or is something missing in my ideia?

I would say, it is ok to encode the return ? But more sexy is it to use the Zend Framework methods to encode it:
// could be set in bootstrap
Zend_Json::$useBuiltinEncoderDecoder = true;
// should be correct utf8
$result = Zend_Json::encode($result);

Related

SOAP Client PHP Error: SOAP-ENV:Server; Procedure 'functionName' not present

i'm using a PHP client for consume a testing web service, I've written my code with the native PHP Soap client and with nusoap library, but get same error.
The response of operation is:
[faultcode] => SOAP-ENV:Server
[faultstring] => Procedure 'xxx' not present
If i use the $client->__getFunctions() it shows correctly the functions, but i don't understand the fault, in many sites recommends disable WSDL caching, but still failing with this changes.
WSDL File used, PHP code for webservice and images folder:
https://drive.google.com/open?id=0BxjxYDI011PdNzBBYlBza1VBY0E
List of functions response (no libraries):
Image name: native.png
Nusoap response (calling function):
Image name: response.png
Additionally i test that with SoapUI but get same response with this status: HTTP/1.1 500 Internal Service Error
I test that client with this webservice with no problems:
http://www.xignite.com/xquotes.asmx?WSDL
Then the code seems to be correct, but...
I need to know if my code has an error, the wsdl definition(i don't any access to server, only this file), or something else, I appreciate any information.
In response.png for your Request, your SOAPAction should point to 'getBankList', not 'http://...' (which points to the service). I'm not sure where you are setting this in the code, but the SOAPAction should point to the wsdl:service name="" value, not the actual running service.
Also, looking at the xignite WSDL, it doesn't have a getBankList function, or in fact the word 'Bank' in it at all. Are you sure you're pointing to the correct WSDL?
HTH, Jim

Magento 1.9.1.0 : Unable to load WSDL using soap cleint

I have tried all the answers given in the following threads.
[1] Magento SOAP API - PHP Exception thrown for login method call: "looks like we got no XML document"
[2] Magento SOAP API - PHP Exception error “looks like we got no XML document”
I am able to load the WSDL in the browser and the WSDL URL is in this format
http://www.foo.com/api/v2_soap/?wsdl
This is the error am getting in the console:
looks like we got no XML document .
This error is usually related to Magento setting up a SoapServer, and not to your SoapClient call, which in turn means that it's usually a problem of your server not being able to fetch the WSDL. Connect toyour server via ssh and issue the following command (with your URL)
$ curl -i 'http://www.foo.com/api/v2_soap/?wsdl'
This will output the HTTP headers, and the response. My guess is the response isn't valid XML (includes debugging, or whitespace), curl couldn't connect to the server (because your host's networking is wrong) or your WSDL points to other WSDLs that can't be connected to.
Solve that problem, and you'll be good to go.

PHP Soap - logic, server, and a lot of other problems

We have the following scenario:
Setup a web service - wsdl and all, supposed to be listening for data sent by the client, receive it, do stuff with it and send a response as 'ok' if everything is okay, and 'false' if something died
Client side runs a script that generates the soap/xml request bit, creates a soap client and sends the request to the wsdl.
Client side gets a result indicating that the data was not processed by the web service - false. And the web service receives no data at all.
I don't have access to the web service - it is someone else's. The generated request body (the whole etc.) is being generated correctly - when I send it through soapUI it works, but not through my php soap client.
I tried using the built-in Soap with the SoapClient, __doRequest, __call (kind of tried everything), but nothing happens - still getting 'false' result. I tried re-writing the NuSoap in order to work with Soap 1.2, but still only a 'false' result for something that returns true.
So, I was wondering if someone can answer me the following questions:
on the server do I need something specially install to get it to work with Soap 1.2 ?
When the client has to send data to the web service's function do I use __doRequest or __call? Or something else?
According to my php.ini the server header_accept values do not have the application/soap+xml that is needed to work with soap 1.2 - could this be the problem, if yes - back to question 1, or how can I add the type to the header_accept?
EDIT:
$client = new SoapClient(
"the_wsdl_url_correct_for_sure.wsdl",
array(
'soap_version' => SOAP_1_2,
'trace' => 1,
)
);
$result = $client->__doRequest(
$the_var_i_use_to_store_the_soap_xml_thingie_that_works_through_soapUI_so_it_is_correct, $location,
$the_function_I_try_to_call,
"1.2"
);
For $location I am the namespace of the action (the function I'm trying to call and send the data from the first parameter to). And for the action/function I tried using just the name of the action as it's defined in the namespace, and using the full path with the "full_namespace/action"
Should I use __doRequest or __call when I'm trying to send the data to the WSDL?
EDIT2:
The request I'm sending is:
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header/>
<env:Body>
<ns2:FunctionName xmlns:ns2="namespace_of_the_service">
<arg0>
<data1>Some data</data1>
</arg0>
</ns2:FunctionName>
</env:Body>
</env:Envelope>
More about the problems from this can read in my previous post:
PHP Soap Client - sending the wrong headers "soapenv:VersionMismatch"
The way you ask your question(s) here does not work well with Stackoverflow, I leave this here as a comment, not as an answer, just to show you that you don't go much ahead in getting these answerwed:
on the server do I need something specially install to get it to work with Soap 1.2 ?
No, a recent PHP version with the Soap extension is enough.
When the client has to send data to the web service's function do I use __doRequest or __call? Or something else?
That depends on the mode (WSDL or not) and as well on what you want to do. What WSDL is and what WSDL mode is, please read the whole Soap book in the PHP manual from start to end and as well I suggest because the documentation is not perfect you make yourself comfortable with what WSDL is and some third-party WSDL SoapClient examples which both you can find through the internet search engine of your choice. For __doRequest please see the manual what you can do with it. For __call the manual clearly says for what it is for and that it is deprecated and so you're probably looking for __soapCall instead.
According to my php.ini the server header_accept values do not have the application/soap+xml that is needed to work with soap 1.2 - could this be the problem, if yes - back to question 1, or how can I add the type to the header_accept?
That might be according to your php.ini, I mean you can write in there what you want, however according to PHP documentation itself there is no header_accept PHP ini directive. Please double check what is written in the PHP.ini and then double-check with the documentation of that directive inside the PHP manual if or if not it controls what you like to control - or if already set - that it does not set something that might stand in your way.
As far as I know for a SoapClient you don't need to set any PHP ini based header accept directive (even next to that that one actually does not exist!) to get it working. It works with the default configuration, so you don't need to add anything.
Which makes me wonder why you actually ask? What makes you think you would need to add anything to that (by you not further specified) ini setting?

Zend_Soap - Error parsing WSDL: Start tag expected, '<' not found

For the same WSDL, which is totally valid, I am able to access it properly using PEAR SOAP like this:
$WSDL = new SOAP_WSDL($this->wsdlUrl);
$proxy = $WSDL->getProxy();
But not able to make it work through Zend_Soap, when used like this:
$soapclient = new Zend_Soap_Client($this->wsdlUrl);
I get the following error when accessed through Zend_Soap_Client:
Error: SOAP-ERROR: Parsing WSDL: Couldn't load
from 'https://abc.xyz.com/agent/TestService.php?wsdl' : Start tag expected, '<' not found
Openssl is also enabled in my php.ini
Does anybody know why it doesn't work? and how I can fix it to use Zend_Soap properly?
You should check if the ssl-Certificate is valid. This Error Message is also thrown if ssl-certificate verification fails.
Check to make sure that no Ports are blocked in your hosting situation.
I've had the same error, though with different code just plain php, and was struggling with it for several days.
It turned out that my webhotel had blocked the port I needed to access the web service.
Or it could some proxy-related issue giving the same blocked result.
Are you using HTTP Authentication? Auth works with SOAP Client, however you cannot access password protected WSDL files
See https://bugs.php.net/bug.php?id=27777

How to create a PHP SOAP Client for calling a WCF Web service under SSL?

We have a WCF service under an SSL Web Server installed in IIS. The web service was created with .NET 3.5 and WCF 3.0. We can access it with a .NET 3.5 client without problems.
Let's call the URL where the service is published something like:
https://my-server.com/testservice.svc?wsdl
We need to make a proof of concept to check if it's possible to access it with a PHP client. I've tried to use NuSOAP or the standard SoapClient of PHP but in both cases i get an exception. Here is my code:
<?php
$wsdl = 'https://my-server.com/testservice.svc?wsdl';
$client = new SoapClient($wsdl);
?>
It returns me an exception with this message:
Error:sendSms: SoapFault exception: [WSDL] SOAP-ERROR: Parsing Schema: can't import schema from 'https://my-server.com/testservice.svc?wsdl' in C:\localhost\test.php:5 Stack trace: #0 C:\localhost\test.php(5): SoapClient->SoapClient('https://my-serv...') #1 {main} "
Any ideas? What am I doing wrong?
http://weblogs.asp.net/gunnarpeipman/archive/2007/09/17/using-wcf-services-with-php.aspx
I am currently investigating this as well, hopefully this helps you
everything looks correct and it seems like it would work, certainly that is the point of SOAP to be able to make calls from other languages.
Maybe try using NuSoap or PEAR Soap_Client so you can set a break-point or just dump the raw output from the server? If the server is returning an error, that might give you some clues. If the server seems to be outputting valid SOAP response, it maybe could be that your web service has some complex object types for args or return values that causes PHP to choke?
According to this question you must grant access rights to the IIS_IUSERS for the directory 'C:/Windows/Temp'.
Late to the party here, but make sure when you set up the WCF service with AddServiceEndpoint, you are using BasicHttpBinding not WebHttpBinding.

Categories