How to create web services in php using NuSOAP library

How to create web services in php

Web services are software available on internet. They can communicate and provide information to client programs based on XML messaging. In this tutorial we are going to learn about how to create web services in php using NuSOAP.

We will also look in to the basics of web services, SOAP and learn to develop web services in php.

1. Create a MySQL database and a table for books.

2. Insert sample data into the database table.

3.  HTML form to get ISBN number from user.

4. POST form data to a php page and send to web service.

5. Create a web service that connects to MySQL database.

6. Fetch book information based on ISBN number and respond to client.

7. Client receives data from web service and display to user.

web services in php

REST Web Services

web services in php

Suppose you are working on a shopping cart application and need to calculate the shipping charges for the user, so instead you develop a new module to calculate shipping, can use a web service from FedEx and get required information. To fetch information about a book based on ISBN, Amazon book web service can be used.

Web services can be implemented using REST or SOAP techniques. REST means you are using existing services or technologies to get content from internet. Web services can be implemented in different languages and platforms. To use a REST web service you only need the URL or contract of  the web service, parameters and what information is sent back.

eBay web service

eBay has many services that provide information about the products etc. There is  eBay GetSingleItem Web Service, this web service can return product details, shipping cost, summary etc. To get this basic information eBay has provided a basic URL and you have to provide an ItemID.

http://open.api.ebay.com/shopping?callname=GetSingleItem&responseencoding=XML&appid=YourAppIDHere&siteid=0&version=967&ItemID=180126682091

<?xml version="1.0" encoding="utf-8"?>

<GetSingleItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
   
   <ItemID>180126682091</ItemID>

</GetSingleItemRequest>

SOAP web services

SOAP or Simple Object Access Protocol is a communication protocol to exchange messages among  computers. To work with SOAP you have to understand different soap elements.

web services in php - soap - envelope

SOAP Envelope

For sending and receiving messages, SOAP has a standard format. SOAP standard is defined by W3C. Every SOAP message is an XML document and has a root element called SOAP Envelope.

SOAP Envelope has an optional tag called header and a mandatory tag called body. Inside body there are all the parameters such as what information you will send to the methods and what information is returned. SOAP is a contract between client and the server.

WSDL or Web Service Description Language

WSDL is a standard by W3C. It serves as a contract between server and client. WSDL contains location of web service, operations and parameters. Operation tags tells that what methods are available. Message tag tells format of messages.

Web services can be implemented by whatever language you want. Every language has set of tools available to implement it. PHP has php SOAP extension. The other popular tool available is called nuSOAP. Let us explore how to create web services in php using NuSOAP library.

Create a MySQL database and table

First we are going to create a database and a table for the web service. Open phpMyAdmin on your computer and click SQL tab. Execute following queries.

Create database dbbookstore;


CREATE TABLE `books` (

  `id` int(11) NOT NULL,

  `title` varchar(500) NOT NULL,

  `author_name` varchar(500) NOT NULL,

  `price` varchar(500) NOT NULL,

  `isbn` varchar(50) NOT NULL,

  `category` varchar(100) NOT NULL

) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `books`
--

INSERT INTO `books` (`id`, `title`, `author_name`, `price`, `isbn`, `category`) VALUES

(1, 'C++ By Example', 'John', '500', 'PR-123-A1', 'Programming'),

(2, 'Java Book', 'Jane davis', '450', 'PR-456-A2', 'Programming'),

(3, 'Database Management Systems', 'Mark', '$75', 'DB-123-ASD', 'Database'),

(4, 'Harry Potter and the Order of the Phoenix', 'J.K. Rowling', '650', 'FC-123-456', 'Novel'),

(5, 'Data Structures', 'author 5', '450', 'FC-456-678', 'Programming'),

(6, 'Learning Web Development ', 'Michael', '300', 'ABC-123-456', 'Web Development'),

(7, 'Professional PHP & MYSQL', 'Programmer Blog', '$340', 'PR-123-456', 'Web Development'),

(8, 'Java Server Pages', 'technical authoer', ' $45.90', 'ABC-567-345', 'Programming'),

(9, 'Marketing', 'author3', '$423.87', '456-GHI-987', 'Business'),

(10, 'Economics', 'autor9', '$45', '234-DSG-456', 'Business');

ALTER TABLE `books` ADD PRIMARY KEY (`id`);

ALTER TABLE `books` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=11;

web services in php

web services in php

Create project folder php-webservices

Open www or root directory of your WAMP or XAMPP installation. Create a folder php-webservices. Download NuSOAP from Sourceforge website. Extract and copy lib folder, paste it in folder you have created above.

Create database connection file using PDO

Create a file named dbconn.php and add php PDO code to connect to database.

<?php

$host         = "localhost";

$username     = "root";

$password     = "root";

$dbname       = "dbbookstore";

try {

    $dbconn = new PDO('mysql:host=localhost;dbname=dbbookstore', $username, $password);

} catch (PDOException $e) {

    print "Error!: " . $e->getMessage() . "<br/>";

    die();

}

Create a Books Web Service using NuSOAP

Create a file named webservice-server.php. To access book information from database you need to include dbconn.php. On successful connection to database this file creates a database connection object.

Include nusoap.php file from lib directory. To create a server side web service new nusoap_server() method is called, that returns soap server object.

<?php

 /** 

  @Description: Book Information Server Side Web Service:
  This Sctript creates a web service using NuSOAP php library. 
  fetchBookData function accepts ISBN and sends back book information.

  @Author:  http://programmerblog.net/

  @Website: http://programmerblog.net/

 */

 require_once('dbconn.php');

 require_once('lib/nusoap.php'); 

 $server = new nusoap_server();

/* Fetch 1 book data */
function fetchBookData($isbn){

  global $dbconn;

  $sql = "SELECT id, title, author_name, price, isbn, category FROM books where isbn = :isbn";

  // prepare sql and bind parameters
    $stmt = $dbconn->prepare($sql);

    $stmt->bindParam(':isbn', $isbn);

    // insert a row
    $stmt->execute();

    $data = $stmt->fetch(PDO::FETCH_ASSOC);

    return json_encode($data);

    $dbconn = null;

}

$server->configureWSDL('booksServer', 'urn:book');

$server->register('fetchBookData',
      array('isbn' => 'xsd:string'),  //parameter
      array('data' => 'xsd:string'),  //output
      'urn:book',   //namespace
      'urn:book#fetchBookData' //soapaction
      );  

$server->service(file_get_contents("php://input"));

?>

A function fetchBookData($isbn){ … } is created. This function will acts as web service. It accepts a parameter as $isbn.

To use database connection object from dbconn.php, $dbconn is declared as a global object. A query is defined to fetch a book record with $isbn as named parameter.

A prepared statement is created using PDO Prepare method. bindParam method binds $isbn to ISBN parameter. execute method runs the query and database record is returned to  $data variable. To fetch data into an array fetch() method is used. Data is json encoded and returned to client web service.

Configure a WSDL for web service

To configure a WSDL, configureWSDL method is used.

$server->configureWSDL('booksServer', 'urn:book');

This method takes two parameters. First parameter is name of WSDL document bookServer and second parameter is the namespace. It is Universal Resource Identifier, it differentiates WSDL from other WSDL documents.

$server->register('fetchBookData',

      array('isbn' => 'xsd:string'),  //parameter

      array('data' => 'xsd:string'),  //output

      'urn:book',   //namespace

      'urn:book#fetchBookData' //soapaction

      );  

$server->service(file_get_contents("php://input"));

The code snippet above registers fetchBookData function as a web service. The other information to provide are the input and output parameters. This web service takes a string parameter as input and returns a string as an output.

xsd means XML schema is used. With XML schema we have pre-defined data types such as integer, string, float etc. Namespace and name of the method is provided.

Display WSDL document

Open you web browser and type following URL in the browser.

http://localhost/php-webservices/webservice-server.php

web services in php wsdl

You can see a nicely formatted page like above. If you click on WSDL  link, displays a WSDL.

web services in php nusoap WSDL

web services in php nusoap wsdl

 

In the bottom of this document,  inside service tag, name of web service in mentioned as a parameter. SOAP address tag’s location parameter contains the location of the web service. An operation tag contains name of fetchBookData web service. fetchBookDataRequest message tag specifies that web service requires ISBN prameter as a string. fetchBookDataResponse tag specifies that web service returns a string as output to client. Now this web service is ready and waiting for a client web service to contact it.

Client web service can be implemented in any language. A client needs to send a SOAP message in a particular format defined by WSDL.

Create HTML form to get ISBN form user

After setup of server let us work on client side. HTML form is created to get ISBN from user and send it to server. Create a file webservice_client.php. Add following code to create a form.

<div class='row'>

 	<form class="form-inline" method = 'post' name='form1'>

 		<?php if($error) { ?> 

     	<div class="alert alert-danger fade in">

   			<a href="#" class="close" data-dismiss="alert">&times;</a>
   			<strong>Error!</strong>&nbsp;<?php echo $error; ?> 

         </div>

   <?php } ?>

     <div class="form-group">

       <label for="email">ISBN:</label>

       <input type="text" class="form-control" name="isbn" id="isbn" placeholder="Enter ISBN">

     </div>

     <button type="submit" name='sub' class="btn btn-default">Fetch Book Information</button>

   </form>

  </div>

 

web services in php

A text box with a button is displayed. When user enters ISBN into this box and clicks submit, data is sent to server.

<?php

  ini_set('display_errors', true);
  
  error_reporting(E_ALL);

  require_once('lib/nusoap.php');
  
  $error  = '';
  
  $result = array();
  
  $wsdl = "http://localhost:8888/php-webservices/webservice-server.php?wsdl";
  
  if(isset($_POST['sub'])){

    $isbn = trim($_POST['isbn']);

    if(!$isbn){

      $error = 'ISBN cannot be left blank.';
    }

    if(!$error){

      //create client object
      $client = new nusoap_client($wsdl, true);

      $err = $client->getError();

      if ($err) {

        echo '<h2>Constructor error</h2>' . $err;

          exit();
      }

      try {

        $result = $client->call('fetchBookData', array('PR-123-456'));

        $result = json_decode($result);

        }catch (Exception $e) {

          echo 'Caught exception: ',  $e->getMessage(), "\n";
       }
    }
  }

?>

In the code above we first include nusoap from lib directory. Then create a $WSDL variable and assigned it the path of WSDL. Next we check if user has entered an ISBN and submitted the form. A client object of nu_soap is created using

$client = new nusoap_client($wsdl, true);

Two parameters are passed to this functions , first is path of WSDL and second argument is true that tells that the first parameter is a WSDL. We use client object’s call method to call a web service.

$result = $client->call('fetchBookData', array('PR-123-456'));

$result = json_decode($result);
call method accepts name of the web service method and an array containing the parameters such as ISBN number. Response is returned in $result variable and is JSON decoded.

Display web service result to user

After HTML form, add HTML table to display result returned from web service.

 <h2>Book Information</h2>

<table class="table">

  <thead>

    <tr>

      <th>Title</th>

      <th>Author</th>

      <th>Price</th>

      <th>ISBN</th>

      <th>Category</th>

    </tr>

  </thead>

  <tbody>

  <?php if(count($result)){ 

    		for ($i=0; $i < count($result); $i++) { ?>

        <tr>

          <td><?php echo $result->title; ?></td>

          <td><?php echo $result->author_name; ?></td>

          <td><?php echo $result->price; ?></td>

          <td><?php echo $result->isbn; ?></td>	

          <td><?php echo $result->category; ?></td>

        </tr>

             <?php 

			}

		} else {  ?>

			<tr>

          <td colspan='5'>Enter ISBN and click on Fetch Book Information button</td>

        </tr>

		<?php } ?>

  </tbody>

</table>

A table is added with Title, Author, Price, ISBN and Category table cells. If result is returned from web service it is displayed to user in a loop.

Web services in php – web service response

web services in php

Summary

To summarize this tutorial you have learned about  basics of web services in php and created a web service using NuSOAP library. Data is fetched from MySQL database by web service and displayed to user. You can download complete source code with MySQL database dump.

Please leave you comments of feed back in the comments. Stay tuned for more cool tutorials. Please follow us  on twitter to get latest information and knowledge on web development industry.

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

  • Pingback: How to create RESTful web services in codeigniter()

  • Hezron Apunza

    Hey, I have tried using a different ISBN but it’s still returning “Professional PHP & MYSL”. Doesn’t return any other book when you use a different ISBN

  • Hezron Apunza

    Hey, I have tried using a different ISBN but it’s still returning “Professional PHP & MYSL”. Doesn’t return any other book when you use a different ISBN

  • Rolly Esteban Chin Maldonado

    Friend, How i could send a xml to this web services: http://200.27.180.194:8053/WS_LandingPageDesa/WS_LandingPage.asmx

    Thanks

  • Daniela Segovia

    Hi!, I tried put the same isbn for two books, but the client only recived one, how can I recive both?
    Thanks

    • Hi,

      Thanks for your message. Yes you can fetch multiple records based on one ISBN. Please follow the steps below.

      In webservice-server.php file. PHP PDO functions are used to fetch information from database. As you can see $stmt->fetch() method is used. Fetch method fetches only one record. FetchAll method can fetch all the records matching a criteria.

      Server side change:

      So change this line in webservice-server.php file.

      $data = $stmt->fetch(PDO::FETCH_ASSOC);

      to

      $data = $stmt->fetchAll(PDO::FETCH_ASSOC);

      Client side change:

      Change webservice-client.php file’s loop code to this. As you can see [$i] is added to display multiple results.

      <?php if(count($result)){
      for ($i=0; $i

      title; ?>
      author_name; ?>
      price; ?>
      isbn; ?>
      category; ?>

      Enter ISBN and click on Fetch Book Information button

      ———-

      You can see in the picture below, multiple records fetched fora single ISBN. Let us know in case of any issue.

      Regards,

      https://uploads.disquscdn.com/images/04c450c0f0e3fae2d7f971dfb119c1670b61bcf2c845a33a1eec888c3b2d1799.png

  • Pingback: How to create a nodejs mongodb rest api and test with postman()

  • Septiana Putri

    when i click “fetch book information” it does not appear the book information. why? i used your code

    • Hi,

      Please make sure you have set up database and credentials correctly,
      If still nothing happens then switch on error_reporting

      Still facing issue, Let us know

      Regards,

    • Are you able to find issue?

      • Septiana Putri

        I using xampp. That’s the problem?

        • Hi,

          No XAMPP is not an issue. When you add

          ini_set(“display_errors”, 1);
          error_reporting(E_ALL);

          on the top inside php tags and run your script. what errors you get. let me know