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?
Related
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
The API I am supposed to target uses this WSDL(http://www.gotoworkspace.com/us/paas/s3PaaS.wsdl), though when I test it in SoapUI I receive no operations. Oddly enough when I make a request on my own client I get a 303 response telling me to redirect to the following - http://www.gotoworkspace.com/us/paas/PaaSServer.php
Questions:
1. What do you think is going on?
2. What is my endpoint and namespace?
SoapUI is not handling the redirect correctly.
Try using http://www.gotoworkspace.com/us/paas/PaaSServer.php?wsdl for your WSDL instead.
At my office I can connect directly to the relevant soap servers and my code works as it should.
However - because of security - it is not allowed that VPN connections (from home) access the SOAP servers. So I have to resort to using an SSH tunnel over a jump-station.
Because the WSDL files contain absolute urls I can't use the "location" to change this, it won't load the WSDL. Therefor I've resolved to adding entries to the hosts files mapping that server name to 127.0.0.1 and and SSH tunnel to our jumpstation forwarding the correct ports.
This allows me to use the original WSDL without modification. I just have to comment out the hosts entries when at the office.
Via SoapUI everything works. I can load the WSDL, it fully parses it (it has a lot of includes - big corporate soap service) and I can launch SOAP requests that get answered correctly.
However, if I do the same via the php SoapClient (running against an apache on localhost) it throws an exception:
SOAP-ERROR: Parsing Schema: can't import schema from 'http://wsdl.service.addres:port/wsdlUri?SCHEMA%2Fsoa.osb.model%2Fsrc%...'
(I've replaced the server and the rest of the request because its not relevant.)
If I take that entire URL and paste it into my browser it results in an WSDL-XML.
The PHP code to load create the SoapClient is as simple as this:
$options =
[
'trace' => 1,
'exception' => 1,
];
$wsdl = '/path/to/local/wsdlfile.xml';
$client = new \SoapClient($wsdl, $options);
Anyone have a clue where to look? I can't think of anything to try anymore.
I know for sure that my PHP is setup correctly (as the code has been working for months at the office and nothing was changed here). Is PHP doing DNS resolving differently and somehow getting another (or no) IP for that corporate server perhaps?
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);
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.