XML in variable for Web Service

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
EddiRae
Forum Newbie
Posts: 9
Joined: Fri Jun 19, 2009 11:00 am

XML in variable for Web Service

Post by EddiRae »

I am trying to pass an XML string into a web service. This is what the web service is expecting.

Here is the entire code for my function:

Code: Select all

<?php
require_once('nusoap.php');
 
function TRECSend($a, $b, $c, $d, $e, $f)
{
  $str = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Transmission><EdProviderData><DetailData><Detail>';
  $str = $str . '<IN_PROV>' . $a . '</IN_PROV> <IN_CRSE>' . $b. '</IN_CRSE> <IN_CDATE>' .$c . '</IN_CDATE> <IN_ZIP>' . $d . '</IN_ZIP>';
  $str = $str . '<IN_LICENSE>' . $e . '</IN_LICENSE> <IN_NAME>' . $f . '</IN_NAME> </Detail> </DetailData> </EdProviderData> </Transmission>';
 
  $wsdl="https://www.trec.state.tx.us/ProcessEdRoster/Service1.asmx?wsdl";
 
  include 'TREC_DevToken.php';
 
  $client=new soapclient($wsdl);
 
//  create header object and insert into headers
//  $header = new SoapHeader('https://www.trec.state.tx.us/ValidationSoapHeader/', 'DevToken', $DevToken, false);
  $header = array(new SoapHeader('https://www.trec.state.tx.us/ValidationSoapHeader/', 'DevToken', $DevToken, false));
 
//  $xmlReq = ('xmlReq' => $str);
  $xmlReq = array('xmlReq' => $str);
 
  try
  {
    $response = $client->__soapCall("ProcessRoster", $xmlReq, null, $header);
    return $response;
  }
  catch (SoapFault $exception)
  {
   return $exception;
   }
}
 
?>
The problem is on line 21. When I don't use the Array, then I get a parse error. When I do use the array, I get a Object Reference not found for line 25.

I don't see anything wrong. I did correct one variable earlier that was giving me the Object Reference. That was corrected on line 12.

Any help would be greatly appreciated.
Eddi Rae
User avatar
yacahuma
Forum Regular
Posts: 870
Joined: Sun Jul 01, 2007 7:11 am

Re: XML in variable for Web Service

Post by yacahuma »

Do you want to use nusoap? I think, please someone correct me if I am wrong, that nusoap was a good idea when php did not have a good soap support, but all that changed in php5. I think you should use soap libraries in php 5 not nusoap libraries.

I know this has nothing to do with your error(or maybe it does....) I see at their website last libraries are from 2007.
User avatar
yacahuma
Forum Regular
Posts: 870
Joined: Sun Jul 01, 2007 7:11 am

Re: XML in variable for Web Service

Post by yacahuma »

I also think this is a mistake

Code: Select all

 
$str = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
 
you do not backslach if you are using single quotes

it should be

Code: Select all

 
 $str = '<?xml version="1.0" encoding="utf-8"?>'
 
Although for your small test it may seem overkill you can try this little wsdl to php tool I created

http://www.stccorp.net/soapwriter/soapwriter.php

The tool will generate all the functions needed. After that you will do something like

Code: Select all

 
$service = new Service();
$roster = new ProcessRoster();
$roster->xmlReq = '<?xml version="1.0" encoding="utf-8"?>....REST HERE';
try
{
$service->ProcessRoster($roster);
    }
    catch (SOAPFault $f)
    {
        $request ="<pre>\n";
        $request .=  "Request :\n".htmlspecialchars($subscriber->soapClient->__getLastRequest()) ."\n";
        $request .= "Response:\n".htmlspecialchars($subscriber->soapClient->__getLastResponse())."\n";
        $request .= "</pre>";
 
       echo   $f->getMessage() . ' ' . $request;
       
    }
 

If you have auth header you will have to modify the class to add the header
you can modify the constructor and add something like this.

Code: Select all

 
     $ns = 'https://www.trec.state.tx.us/ValidationSoapHeader/';
       $AuthHeader = new ValidationSoapHeader();
      $AuthHeader->DevToken ='TOKEN HERE';
       $header =  new SoapHeader($ns,"ValidationSoapHeader", $AuthHeader,false);
       $this->soapClient->__setSoapHeaders(array($header));   
 
You can modify the constructors so you can do $AuthHeader = new ValidationSoapHeader('TOKEN HERE');
EddiRae
Forum Newbie
Posts: 9
Joined: Fri Jun 19, 2009 11:00 am

Re: XML in variable for Web Service

Post by EddiRae »

Where were you 3 weeks ago!!! Thank you for your post. I am not very familiar with PHP. In fact this is my first project using it. Any help would be greatly appreciated.

Here is the newest code. I am getting an error, though.

[Wed Aug 19 09:56:42 2009] [error] [client 127.0.0.1] PHP Fatal error: Class 'Service' not found in C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\TREC.php on line 13

Code: Select all

<?php
function TRECSend($a, $b, $c, $d, $e, $f)
{
  $str = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Transmission><EdProviderData><DetailData><Detail>';
  $str = $str . '<IN_PROV>' . $a . '</IN_PROV> <IN_CRSE>' . $b. '</IN_CRSE> <IN_CDATE>' .$c . '</IN_CDATE> <IN_ZIP>' . $d . '</IN_ZIP>';
  $str = $str . '<IN_LICENSE>' . $e . '</IN_LICENSE> <IN_NAME>' . $f . '</IN_NAME> </Detail> </DetailData> </EdProviderData> </Transmission>';
  $str = '"' . $str . '"';
 
  include 'TREC_DevToken.php';
  
  $wsdl="https://www.trec.state.tx.us/ProcessEdRoster/Service1.asmx?wsdl";
 
  $service = new Service();
  $roster = new ProcessRoster();
  $roster->xmlReq = $str;
 
  $ns = 'https://www.trec.state.tx.us/ValidationSoapHeader/';
  $AuthHeader = new ValidationSoapHeader();
  $AuthHeader->DevToken =$DevToken;
  $header =  new SoapHeader($ns,"ValidationSoapHeader", $AuthHeader,false);
  $this->soapClient->__setSoapHeaders(array($header));
 
  try
  {
     $service->ProcessRoster($roster);
  }
  catch (SOAPFault $Message)
  {
    $request ="<pre>\n";
    $request .=  "Request :\n".htmlspecialchars($subscriber->soapClient->__getLastRequest()) ."\n";
    $request .= "Response:\n".htmlspecialchars($subscriber->soapClient->__getLastResponse())."\n";
    $request .= "</pre>";
 
    return   $Message->getMessage() . ' ' . $request;
  }
}
?>
User avatar
yacahuma
Forum Regular
Posts: 870
Joined: Sun Jul 01, 2007 7:11 am

Re: XML in variable for Web Service

Post by yacahuma »

The service is part of the code created using the tool I gave you. Go to the page. Enter your wsld address and the tool will generate the code.

Save the file and include the file in your code.
User avatar
yacahuma
Forum Regular
Posts: 870
Joined: Sun Jul 01, 2007 7:11 am

Re: XML in variable for Web Service

Post by yacahuma »

This is the class file

Code: Select all

 
<?php
class HelloWorld {
}
class HelloWorldResponse {
    var $HelloWorldResult;//string
}
class ProcessRoster {
    var $xmlReq;//string
    function __construct($xmlReq) {
        $this->xmlReq = $xmlReq;
    }    
}
class ProcessRosterResponse {
    var $ProcessRosterResult;//string
}
class ValidationSoapHeader {
    var $DevToken;//string
    function __construct($DevToken) {
        $this->DevToken = $DevToken;
    }
}
class TRECSoapClient {
    var $soapClient;
    
    private static $classmap = array('HelloWorld'=>'HelloWorld', 'HelloWorldResponse'=>'HelloWorldResponse', 'ProcessRoster'=>'ProcessRoster', 'ProcessRosterResponse'=>'ProcessRosterResponse', 'ValidationSoapHeader'=>'ValidationSoapHeader');
    
    function __construct($url = 'https://www.trec.state.tx.us/ProcessEdRoster/Service1.asmx?wsdl') {
        $this->soapClient = new SoapClient($url, array("classmap"=>self::$classmap, "trace"=>true, "exceptions"=>true));
        
        include 'TREC_DevToken.php'; //DONT KNOW WHAT IS HERE
        $ns = 'https://www.trec.state.tx.us/ValidationSoapHeader/';
        $AuthHeader = new ValidationSoapHeader($DevToken);
        $header = new SoapHeader($ns, "ValidationSoapHeader", $AuthHeader, false);
        $this->soapClient->__setSoapHeaders(array($header));
    
    }
    
    function HelloWorld($HelloWorld) {
        
        $HelloWorldResponse = $this->soapClient->HelloWorld($HelloWorld);
        return $HelloWorldResponse;
    
    }
    function ProcessRoster($ProcessRoster) {
        
        $ProcessRosterResponse = $this->soapClient->ProcessRoster($ProcessRoster);
        return $ProcessRosterResponse;
    
    }
    function HelloWorld($HelloWorld) {
        
        $HelloWorldResponse = $this->soapClient->HelloWorld($HelloWorld);
        return $HelloWorldResponse;
    
    }
    function ProcessRoster($ProcessRoster) {
        
        $ProcessRosterResponse = $this->soapClient->ProcessRoster($ProcessRoster);
        return $ProcessRosterResponse;
    
    }
}
 
 
?>
 

Code: Select all

 
<?php
include 'TRECSoapClient.php';
 
 function TRECSend($a, $b, $c, $d, $e, $f)
 {
   $xml = '<?xml version="1.0" encoding="UTF-8" ?><Transmission><EdProviderData><DetailData><Detail>';
  $xml .= '<IN_PROV>' . $a . '</IN_PROV> <IN_CRSE>' . $b. '</IN_CRSE> <IN_CDATE>' .$c . '</IN_CDATE> <IN_ZIP>' . $d . '</IN_ZIP>';
  $xml .=  '<IN_LICENSE>' . $e . '</IN_LICENSE> <IN_NAME>' . $f . '</IN_NAME> </Detail> </DetailData> </EdProviderData> </Transmission>';
 
  
    try
   {
      $client= new TRECSoapClient();
      $client->ProcessRoster(new ProcessRoster($xml));
   }
   catch (SOAPFault $f)
   {
       echo  $f->getMessage();
        return false; //or whatever you want to return
   }
 }
 ?>
 
I uploded the class file, change it to .php

See if that works
EddiRae
Forum Newbie
Posts: 9
Joined: Fri Jun 19, 2009 11:00 am

Re: XML in variable for Web Service

Post by EddiRae »

We are getting there. I am using the SoapHeader.

I am getting this error:
[Wed Aug 19 11:16:52 2009] [error] [client 127.0.0.1] PHP Fatal error: Using $this when not in object context in C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\TREC.php on line 65

Here is my code as it is now:

Code: Select all

 <?php
class HelloWorld{}
class HelloWorldResponse
{
  var $HelloWorldResult;//string
}
class ProcessRoster
{
  var $xmlReq;//string
}
class ProcessRosterResponse
{
  var $ProcessRosterResult;//string
}
class ValidationSoapHeader
{
  var $DevToken;//string
}
class Service
{
  var $SoapClient;
  private static $classmap = array('HelloWorld'=>'HelloWorld'
          ,'HelloWorldResponse'=>'HelloWorldResponse'
          ,'ProcessRoster'=>'ProcessRoster'
          ,'ProcessRosterResponse'=>'ProcessRosterResponse'
          ,'ValidationSoapHeader'=>'ValidationSoapHeader');
          
  function __construct($url='https://www.trec.state.tx.us/ProcessEdRoster/Service1.asmx?wsdl')
  {
    $this->soapClient = new SoapClient($url,array("classmap"=>self::$classmap,"trace" => true,"exceptions" => true));
  }
  
  function HelloWorld($HelloWorld)
  {
    $HelloWorldResponse = $this->soapClient->HelloWorld($HelloWorld);
    return $HelloWorldResponse;
  }
 
  function ProcessRoster($ProcessRoster)
  {
    $ProcessRosterResponse = $this->soapClient->ProcessRoster($ProcessRoster);
    return $ProcessRosterResponse;
  }
}
 
function TRECSend($a, $b, $c, $d, $e, $f)
{
       $str = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Transmission><EdProviderData><DetailData><Detail>';
       $str = $str . '<IN_PROV>' . $a . '</IN_PROV> <IN_CRSE>' . $b. '</IN_CRSE> <IN_CDATE>' .$c . '</IN_CDATE> <IN_ZIP>' . $d . '</IN_ZIP>';
       $str = $str . '<IN_LICENSE>' . $e . '</IN_LICENSE> <IN_NAME>' . $f . '</IN_NAME> </Detail> </DetailData> </EdProviderData> </Transmission>';
       $str = '"' . $str . '"';
 
       include 'TREC_DevToken.php';
 
       $wsdl="https://www.trec.state.tx.us/ProcessEdRoster/Service1.asmx?wsdl";
 
       $service = new Service();
       $roster = new ProcessRoster();
       $roster->xmlReq = $str;
 
       $ns = 'https://www.trec.state.tx.us/ValidationSoapHeader/';
       $AuthHeader = new ValidationSoapHeader();
       $AuthHeader->DevToken =$DevToken;
       $header =  new SoapHeader($ns,"ValidationSoapHeader", $AuthHeader,false);
       $this->soapClient->__setSoapHeaders(array($header));
 
       try
       {
         $service->ProcessRoster($roster);
       }
       catch (SOAPFault $Message)
       {
         $request ="<pre>\n";
         $request .=  "Request :\n".htmlspecialchars($subscriber->soapClient->__getLastRequest()) ."\n";
         $request .= "Response:\n".htmlspecialchars($subscriber->soapClient->__getLastResponse())."\n";
         $request .= "</pre>";
         return   $Message->getMessage() . ' ' . $request;
       }
}
?>
 
Thank you for all your help!!
Eddi Rae
User avatar
yacahuma
Forum Regular
Posts: 870
Joined: Sun Jul 01, 2007 7:11 am

Re: XML in variable for Web Service

Post by yacahuma »

please check out the code above
EddiRae
Forum Newbie
Posts: 9
Joined: Fri Jun 19, 2009 11:00 am

Re: XML in variable for Web Service

Post by EddiRae »

Getting closer ... I am now getting this error from the SERVER:

Server was unable to process request. ---> Object reference not set to an instance of an object.Returned:

There is nothing in the error.log file that explains this.

What should I look for?
EddiRae
Forum Newbie
Posts: 9
Joined: Fri Jun 19, 2009 11:00 am

Re: XML in variable for Web Service

Post by EddiRae »

yacahuma,
Why would you have the "GetMessage"? There isn't a class that is in the SoapClient referencing to that. I think this is the only piece that I need to fix. It seems to be working so far.

Code: Select all

<?php
include 'TRECSoapClient.php';
 
function TRECSend($a, $b, $c, $d, $e, $f)
{
       $xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Transmission><EdProviderData><DetailData><Detail>';
       $xml = $xml . '<IN_PROV>' . $a . '</IN_PROV> <IN_CRSE>' . $b. '</IN_CRSE> <IN_CDATE>' .$c . '</IN_CDATE> <IN_ZIP>' . $d . '</IN_ZIP>';
       $xml = $xml . '<IN_LICENSE>' . $e . '</IN_LICENSE> <IN_NAME>' . $f . '</IN_NAME> </Detail> </DetailData> </EdProviderData> </Transmission>';
       $xml = '"' . $xml . '"';
 
       try
       {
         $client = new TRECSoapClient();
         $client->ProcessRoster(new ProcessRoster($xml));
       }
       catch (SOAPFault $Message)
       {
//         echo $Message->GetMessage();
         return   $Message->getMessage();
//         return false;
       }
}
?>
EddiRae
Forum Newbie
Posts: 9
Joined: Fri Jun 19, 2009 11:00 am

Re: XML in variable for Web Service

Post by EddiRae »

yacahuma,
Sorry for such a long delay in responding to this post.
I have the function that looks like this (TREC.php):

Code: Select all

 
<?php
include 'TRECSoapClient.php';
 
function TRECSend($a, $b, $c, $d, $e, $f)
{
       $xml = '<?xml version="1.0" encoding="UTF-8" ?>';
       $xml = $xml . '<Transmission><EdProviderData><DetailData><Detail>';
       $xml = $xml . '<IN_PROV>' . $a . '</IN_PROV> <IN_CRSE>' . $b. '</IN_CRSE> <IN_CDATE>' .$c . '</IN_CDATE> <IN_ZIP>' . $d . '</IN_ZIP>';
       $xml = $xml . '<IN_LICENSE>' . $e . '</IN_LICENSE> <IN_NAME>' . $f . '</IN_NAME> ';
       $xml = $xml . '</Detail> </DetailData> </EdProviderData> </Transmission>';
       $xml = '"' . $xml . '"';
 
       try
       {
        $client = new TRECSoapClient();
         $client->ProcessRoster(new ProcessRoster($xml));
       }
       catch (SOAPFault $Message)
       {
//         echo $Message->GetMessage();
         return   $Message->getMessage();
//         return false;
       }
}
?>
 

I am still getting the message, "Returned: Server was unable to process request. ---> Object reference not set to an instance of an object."

I am not sure what I need to do now.
Post Reply