Soap Error

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
User avatar
phpcoder
Forum Contributor
Posts: 158
Joined: Sat Nov 02, 2002 1:18 pm
Location: Manchester, UK

Soap Error

Post by phpcoder »

HI,
I am posting this again please is there some one to help me. I wrote a simple client in php to access soap service, when I try to run client I got following error:

Fatal error: Uncaught SoapFault exception: [soap:Server] Server was unable to process request. ---> Object reference not set to an instance of an object. in C:\wamp\www\testsoap.php:10 Stack trace: #0 [internal function]: SoapClient->__call('PlaceOrder', Array) #1 C:\wamp\www\testsoap.php(10): SoapClient->PlaceOrder(1, 2, 3, 4) #2 {main} thrown in C:\wamp\www\testsoap.php on line 10

Please help me to write this soap client.
Thanks

Client.php

Code: Select all

$client = new SoapClient('http://192.168.1.74/starwstest/wmsorderfulfilment.asmx?WSDL');
$response = $client->CancelOrder('SOR01212')
User avatar
aceconcepts
DevNet Resident
Posts: 1424
Joined: Mon Feb 06, 2006 11:26 am
Location: London

Post by aceconcepts »

Object reference not set to an instance of an object
This seems to hint at the problem. Can you show your code up to line 10 of testsoap.php?
User avatar
phpcoder
Forum Contributor
Posts: 158
Joined: Sat Nov 02, 2002 1:18 pm
Location: Manchester, UK

Post by phpcoder »

aceconcepts wrote:
Object reference not set to an instance of an object
This seems to hint at the problem. Can you show your code up to line 10 of testsoap.php?

Code: Select all

<?php 
class Test {
    public $ordno;
    }

$parameters = new Test;
$parameters -> ordno = "SOR01212";
$array[0] = "SOR01212";
$client = new SoapClient('http://www.perfumefirst.co.uk/ws.wsdl');
[Line#10]$response = $client->CancelOrder('SORO1214545');
?>
I got this error on calling any of the function of the wsdl file.
User avatar
volka
DevNet Evangelist
Posts: 8391
Joined: Tue May 07, 2002 9:48 am
Location: Berlin, ger

Post by volka »

First please try something simpler

Code: Select all

<?php
$client = new SoapClient('http://www.macs-software.co.uk/starws/WMSOrderfulfilment.asmx?WSDL');
$response = $client->echo( array('a'=>date('H:i:s')) );
var_dump($response);
Now compare this to the output of http://www.macs-software.co.uk/starws/W ... mx?op=echo
See how this matches?
I could also use something like

Code: Select all

<?php
class WMSOrderfulfilment_echo {
	public $a;
	
	public function __construct($message) {
		$this->a = (string)$message;
	}
}

$e = new WMSOrderfulfilment_echo( date('H:i:s') );

$client = new SoapClient('http://www.macs-software.co.uk/starws/WMSOrderfulfilment.asmx?WSDL');
$response = $client->echo( $e );
var_dump($response);
Your cancellation request might look like

Code: Select all

<?php
$client = new SoapClient('http://www.macs-software.co.uk/starws/WMSOrderfulfilment.asmx?WSDL');
$response = $client->CancelOrder(array('OrderCancellation'=>array('OrderNumber'=>'SOR01212')));
var_dump($response);
according to http://www.macs-software.co.uk/starws/W ... ancelOrder you will get an response without any data in it - no way to find out wether an order actually has been canceled or not.

And now the part you won't like. Take a look at http://www.macs-software.co.uk/starws/W ... PlaceOrder
php5's soap extension doesn't create stubs for all those objects/interfaces (like other languages/frameworks/IDEs do). At least you can have it print the types via print_r($client->__getTypes()).
User avatar
phpcoder
Forum Contributor
Posts: 158
Joined: Sat Nov 02, 2002 1:18 pm
Location: Manchester, UK

Post by phpcoder »

volka wrote:First please try something simpler

Code: Select all

<?php
$client = new SoapClient('http://www.macs-software.co.uk/starws/WMSOrderfulfilment.asmx?WSDL');
$response = $client->echo( array('a'=>date('H:i:s')) );
var_dump($response);
Now compare this to the output of http://www.macs-software.co.uk/starws/W ... mx?op=echo
See how this matches?
I could also use something like

Code: Select all

<?php
class WMSOrderfulfilment_echo {
	public $a;
	
	public function __construct($message) {
		$this->a = (string)$message;
	}
}

$e = new WMSOrderfulfilment_echo( date('H:i:s') );

$client = new SoapClient('http://www.macs-software.co.uk/starws/WMSOrderfulfilment.asmx?WSDL');
$response = $client->echo( $e );
var_dump($response);
Your cancellation request might look like

Code: Select all

<?php
$client = new SoapClient('http://www.macs-software.co.uk/starws/WMSOrderfulfilment.asmx?WSDL');
$response = $client->CancelOrder(array('OrderCancellation'=>array('OrderNumber'=>'SOR01212')));
var_dump($response);
according to http://www.macs-software.co.uk/starws/W ... ancelOrder you will get an response without any data in it - no way to find out wether an order actually has been canceled or not.

And now the part you won't like. Take a look at http://www.macs-software.co.uk/starws/W ... PlaceOrder
php5's soap extension doesn't create stubs for all those objects/interfaces (like other languages/frameworks/IDEs do). At least you can have it print the types via print_r($client->__getTypes()).
Hi I manged to remove error but now when I try to display response I am getting following error:

Object of class stdClass could not be converted to string

The code that I am using to display response is

Code: Select all

$res = $client->CancelOrder($wrap);

print  $res;
mcog_esteban
Forum Contributor
Posts: 127
Joined: Tue Dec 30, 2003 3:28 pm

Post by mcog_esteban »

This is the CancelOrder parameter:
<s:element name="OrderCancellation" type="s1:OrderCancellation"/>
<s:complexType name="OrderCancellation">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="OrderNumber" type="s:string"/>
</s:sequence>
</s:complexType>
Do the same thing for the response value and add the "stubs"

Code: Select all

class OrderCancelation
{
         /**
         * @var string OrderNumber */
        public $OrderNumber;
}

class OrderCancelationResponse
{
         /**
         * @var string Response */
        public $Response;
}
then

Code: Select all

$request = new OrderCancelation();
$request->OrderNumber = 'SOR01212';

$args = array($request);

$response = new OrderCancelationResponse();
$response = $client->$client->__call("CancelOrder", $args);
....
the idea is to create a "stub" for each request/response types on the operations.
User avatar
volka
DevNet Evangelist
Posts: 8391
Joined: Tue May 07, 2002 9:48 am
Location: Berlin, ger

Post by volka »

phpcoder wrote:Hi I manged to remove error but now when I try to display response I am getting following error:

Object of class stdClass could not be converted to string
That's why I used var_dump().
You get an empty stdClass object as response; no property, no method defined.
User avatar
phpcoder
Forum Contributor
Posts: 158
Joined: Sat Nov 02, 2002 1:18 pm
Location: Manchester, UK

Post by phpcoder »

mcog_esteban wrote:This is the CancelOrder parameter:
<s:element name="OrderCancellation" type="s1:OrderCancellation"/>
<s:complexType name="OrderCancellation">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="OrderNumber" type="s:string"/>
</s:sequence>
</s:complexType>
Do the same thing for the response value and add the "stubs"

Code: Select all

class OrderCancelation
{
         /**
         * @var string OrderNumber */
        public $OrderNumber;
}

class OrderCancelationResponse
{
         /**
         * @var string Response */
        public $Response;
}
then

Code: Select all

$request = new OrderCancelation();
$request->OrderNumber = 'SOR01212';

$args = array($request);

$response = new OrderCancelationResponse();
$response = $client->$client->__call("CancelOrder", $args);
....
the idea is to create a "stub" for each request/response types on the operations.




My php code is as follows:

Code: Select all

<?php

class OrderCancellation
{
	public $OrderNumber;
}

class CancelOrder
{
	public $OrderCancellation;
}

class OrderCancelationResponse 
{ 
        public $Response; 
} 


class SoapClientDebug extends SoapClient {
  public function __doRequest($request, $location, $action, $version) {
    echo '<pre>request: ', htmlentities($request), "\n</pre>\n";
    $response = parent::__doRequest($request, $location, $action, $version);
    echo '<pre>response: ', htmlentities($response), "\n</pre>\n";
    return $response;
  }
}

$client = new SoapClientDebug("http://192.168.1.74/starwstest/wmsorderfulfilment.asmx?WSDL");
$ob = new OrderCancellation;
$ob->OrderNumber = '123456';
$wrap = new CancelOrder;
$wrap->OrderCancellation = $ob;
$res = new OrderCancelationResponse(); 
$res = $client->CancelOrder($wrap);
echo $res->Response;

?>
Is this is the right way I am doing? And also the I am getting empty response i.e I am getting just blank screen. Is there something I am doing wrong or server is replying with empty string?

Response I am getting

Code: Select all

request: <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://uk.co.macs-software.integration.wms.messagetypes/v1.00" xmlns:ns2="http://uk.co.macs-software/WMSOrderFulfilment/"><SOAP-ENV:Body><ns2:CancelOrder><ns1:OrderCancellation><ns1:OrderNumber>123456</ns1:OrderNumber></ns1:OrderCancellation></ns2:CancelOrder></SOAP-ENV:Body></SOAP-ENV:Envelope>


response: <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><CancelOrderResponse xmlns="http://uk.co.macs-software/WMSOrderFulfilment/" /></soap:Body></soap:Envelope>
Help me please
mcog_esteban
Forum Contributor
Posts: 127
Joined: Tue Dec 30, 2003 3:28 pm

Post by mcog_esteban »

I don't know what you do on the server, but you should return an object type of OrderCancelationResponse.

Code: Select all

........
//On the server
$res =  new OrderCancelationResponse();
$res->Response = "something";

return $res;
User avatar
volka
DevNet Evangelist
Posts: 8391
Joined: Tue May 07, 2002 9:48 am
Location: Berlin, ger

Post by volka »

If the current wsdl file still is http://www.macs-software.co.uk/starws/W ... .asmx?WSDL then the response really doesn't carry any payload data.
<s:element name="CancelOrderResponse">
<s:complexType/>
</s:element>
You can see proof of that in the plain xml response string
<soap:Body><CancelOrderResponse xmlns="http://uk.co.macs-software/WMSOrderFulfilment/" /></soap:Body>
volka wrote:You get an empty stdClass object as response; no property, no method defined.
Is http://192.168.1.74/starwstest a test environment for http://www.macs-software.co.uk/starws/ ? (it certainly looks like it is)
User avatar
phpcoder
Forum Contributor
Posts: 158
Joined: Sat Nov 02, 2002 1:18 pm
Location: Manchester, UK

Post by phpcoder »

volka wrote:If the current wsdl file still is http://www.macs-software.co.uk/starws/W ... .asmx?WSDL then the response really doesn't carry any payload data.
<s:element name="CancelOrderResponse">
<s:complexType/>
</s:element>
You can see proof of that in the plain xml response string
<soap:Body><CancelOrderResponse xmlns="http://uk.co.macs-software/WMSOrderFulfilment/" /></soap:Body>
volka wrote:You get an empty stdClass object as response; no property, no method defined.
Is http://192.168.1.74/starwstest a test environment for http://www.macs-software.co.uk/starws/ ? (it certainly looks like it is)
Yep it is. Please could you tell me how to pass parameters(If you can look at my post Soap Service Parameters
Thnaks
Post Reply