Introduction
In the tutorial, working with restful services in codeigniter – put example, I am going to show you how you can work with RESTful or REST webservice in Codeigniter framework. The HTTP PUT method is used to update the existing record in server side.
Related Posts:
- Working with RESTful services in Codeigniter – POST example
- Codeigniter GET example with REST service
- Working with RESTful services in Codeigniter – DELETE example
The base/root URI for the Web service such as http://<host>/<appcontext/contextpath>/<url pattern>/<resources>
.
The MIME type of the response data supported, which are JSON/XML/TEXT/HTML etc.
HTTP PUT: Update an existing resource or collection of resources.
Prerequisites
Please go through Setup RESTful service with Codeigniter, MySQL 5.x – 8.0.26
Project Directory
It’s assumed that you have setup Apache, PHP and Codeigniter in Windows system.
Now I will create a project root directory called codeIgniter-rest-api-put the Apache server’s htdocs folder.
Now move all the directories and files from CodeIgniter framework into codeIgniter-rest-api-put directory.
I may not mention the project root directory in subsequent sections and I will assume that I am talking with respect to the project root directory.
MySQL Table
Create a MySQL table contact under database roytuts. This table stores information for contact address details. For MySQL version 5.x, use the following table structure.
USE `roytuts`;
/*Table structure for table `contact` */
DROP TABLE IF EXISTS `contact`;
CREATE TABLE `contact` (
`contact_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`contact_name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`contact_address` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
`contact_phone` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`contact_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
If you are using MySQL version 8.x then use the following table structure:
CREATE TABLE `contact` (
`contact_id` int unsigned COLLATE utf8mb4_unicode_ci NOT NULL AUTO_INCREMENT,
`contact_name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
`contact_address` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
`contact_phone` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`contact_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Dump some data into table contact. You need to test your example about “working with restful services in codeigniter – put example” and for that you need some data in the database table. Therefore I am dumping some sample data into the table. If your data are coming from different sources then you don’t need it.
insert into
`contact`(`contact_id`,`contact_name`,`contact_address`,`contact_phone`)
values
(1,'S Roy','https://roytuts.com','1234578960'),
(2,'S Roy','https://roytuts.com','1234578960'),
(3,'S Roy','https://roytuts.com','5454544574'),
(4,'S Roy','https://roytuts.com','4578912360'),
(5,'S Roy','https://roytuts.com','8945761254'),
(6,'S Roy','https://roytuts.com','4587961235'),
(7,'S Roy','https://roytuts.com','1254897652'),
(12,'S Roy','Earth','1234567890');
Autoload Configuration
You need some configurations, such as, auto-loading for helpers to avoid loading every time you need to use.
Modify application/config/autoload.php file for auto-loading libraries and helper functions.
This one time auto-loading gives flexibility to uniformly use the helpers and libraries anywhere throughout the application without loading repeatedly.
For my example I am auto-loading database, url, file.
It is not mandatory but if you auto-load the libraries or helper classes which are repeatedly used in many places throughout the application then these classes are available anywhere and it simplifies your life.
$autoload['helper'] = array('url', 'file');
$autoload['libraries'] = array('database');
Database Configurations
Modify also <root directory>/application/config/database.php. This modification is required in order to establish the connection with database and performing database queries.
'hostname' => 'localhost',
'username' => 'root',
'password' => 'root',
'database' => 'roytuts',
'dbdriver' => 'mysqli',
Controller Class
Create a controller file RestPutController.php under <project root>/application/controllers with the following source code.
Here notice how I have declare the method name update_contact_put()
, the actual method name is update_contact
but as I am going to apply HTTP PUT operation so I am appending _put
to the actual method in order to get benefit of the built-in API’s functionality otherwise you might have to handled the http put operation in some other way.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require_once 'Format.php';
require_once 'RestController.php';
use chriskacerguis\RestServer\RestController;
/**
* Description of RestPutController
*
* @author https://roytuts.com
*/
class RestPutController extends RestController {
function __construct() {
parent::__construct();
$this->load->model('ContactModel', 'cm');
}
function update_contact_put() {
$contact_id = $this->put('contact_id');
$contact_name = $this->put('contact_name');
$contact_address = $this->put('contact_address');
$contact_phone = $this->put('contact_phone');
$result = $this->cm->update_contact($contact_id, $contact_name, $contact_address, $contact_phone);
if ($result === FALSE) {
$this->response(array('status' => 'failed'));
} else {
$this->response(array('status' => 'success'));
}
}
}
In the above class, $this->put()
reads the PUT arguments.
Model Class
Create a model file ContactModel.php under <project root>/application/models with the following source code.
The below model function gets the input values from controller class and update the contact information in database.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Description of ContactModel
*
* @author https://roytuts.com
*/
class ContactModel extends CI_Model {
private $contact = 'contact';
function update_contact($contact_id, $contact_name, $contact_address, $contact_phone) {
$data = array('contact_name' => $contact_name, 'contact_address' => $contact_address, 'contact_phone' => $contact_phone);
$this->db->where('contact_id', $contact_id);
$this->db->update($this->contact, $data);
}
}
Testing REST API PUT Example
Now run the application on apache http server. Or deploy the application using CLI mode. I have strated application in CLI mode and application deployed at localhost in 8000 port.
Use the REST Client in Firefox browser to test the REST service.
Method: PUT
Headers: Add Custom Header as name = Content-Type, value=application/json
URL: http://localhost:8000/restputcontroller/update_contact
Body: {“contact_id”:”12″, “contact_name”:”S Roy”, “contact_address”:”https://roytuts.com”, “contact_phone”:”1234567890″}
$[‘rest_default_format’]=’json’ at <root directory>/application/config/rest.php
Output:
{
"status": "success"
}
The visual representation of the test result:
Check the database table, you will see the row has been updated with below data.
Here you see the contact_id with 12 has been updated. If you check the row value in the initial data then you can find that the column values were different for this row.
contact_id contact_name contact_address contact_phone
12 S Roy https://roytuts.com 1234567890
Visual representation of the updated data:
where you define $this->post() or $this->put() in this project
In Postman, under Body set ‘x-www-form-urlencoded’ then add your key-value pairs in your Body.