0
votes

We have the following scenario:

  1. 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
  2. Client side runs a script that generates the soap/xml request bit, creates a soap client and sends the request to the wsdl.
  3. 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:

  1. on the server do I need something specially install to get it to work with Soap 1.2 ?

  2. When the client has to send data to the web service's function do I use __doRequest or __call? Or something else?

  3. 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"

1
There can be many reasons. Best suggestions I can give: Get a recent PHP version. Use the built-in SoapClient class for starters, it supports SOAP 1.2. You most likely provide the wrong argument. Are you in WSDL mode or not? Where is your code (stick to SoapClient with an example code here if you ask me)? - hakre
Unfortunately, I do not have access to the server - can't reconfigure it on my own :/ And I did use the built in Soap, but it kept giving me error about mismatched versions of the Soap, from which I concluded that it simply doesn't support 1.2... or something is dying along the way. I will add my soapClient code and the request in my main post. - Iv3
If you get a concrete error message, add it to your question. Also enable debug mode of the SoapClient class and see the SOAP request and response verbatim. You might want to add those two to your question as well. - hakre
I have this enabled, but I do not get any errors. - Iv3
Please see Debugging PHP SOAP call - It works by enabling the trace mode of SoapClient, explained with the docs for SoapClient::__getLastResponse. - Then check the request and the response XML of the SOAP communication. - hakre

1 Answers

0
votes

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:

  1. 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.

  2. 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.

  3. 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?