PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

ภาคต่อ ใช้งาน RESTful Services ฟังก์ชั่นสำหรับ POST ข้อมูล

04 May 2016 By


จากเนื้อหาตอนที่แล้วเราได้รู้จักการใช้งาน Rest Server ในการสร้าง
RESTful API สำหรับการเรียกใช้งานผ่าน HTTP GET มาแล้ว เนื้อหานี้
เราจะพูดถึงการสร้าง RESTful API สำหรับการใช้งานผ่าน HTTP POST กัน
โดยก่อนจะเข้าไปในส่วนของรายละเอียด จะขอพูดถึงส่วนของการกำหนด
และรับค่า parameter ในฟังก์ชั่น 
 
ตัวอย่างไฟล์ News.php ในโฟลเดอร์ apps > controllers > api
จากเนื้อหาตอนที่แล้ว
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require(APPPATH.'libraries/REST_Controller.php');

class News extends REST_Controller
{
    public function index_get()
    {
        $data = array(
            array(
                "id"=>1,
                "topic"=>"หัวข้อข่าวที่ 1"
            ),
            array(
                "id"=>2,
                "topic"=>"หัวข้อข่าวที่ 2"
            ),
            array(
                "id"=>3,
                "topic"=>"หัวข้อข่าวที่ 3"
            ),
        );
        $this->response($data, 200);
        // ดึงรายการข่าวทั้งหมด
    }

}
 
เมื่อเรามีการเรียกดูข้อมูล โดยทำการส่ง Requests HTTP GET 
มาที่ url http://localhost/learnci/api/news/index
RESTful Service ที่เราสร้างขึ้นก็จะส่งข้อมูลรายการ ข่าวทั้งหมด 3 รายการ
กลับไป แต่สมมติว่าเราต้องการข้อมูลแค่่บางรายการ เช่น ต้องการดูเฉพาะข้อมูล
รายการที่ 3 เราก็สามารถทำได้โดยการส่งค่า parameter เพิ่มเข้ามา ยกตัวอย่าง
สมมติเราส่ง id=3 เข้ามาเป็นดังนี้
http://localhost/learnci/api/news/index/?id=3
หรือ
http://localhost/learnci/api/news/index/id/3
 
กรณีดังกล่าวด้านบน เราสามารถใช้งานค่า parameter โดยใช้
 
$this->get('id');  // หากเป็นส่วนของฟังก์ชั่น GET
$this->post('id');  // หากเป็นส่วนของฟังก์ชั่น POST
$this->put('id');  // หากเป็นส่วนของฟังก์ชั่น PUT
$this->delete('id');  // หากเป็นส่วนของฟังก์ชั่น DELETE

ส่วนฟังก์ชั่นสำหรับคืนค่ากลับออกไปจะใช้

$this->response();  // เช่น  $this->response($data);
 
เรามาลองปรับฟังก์ชั่น GET ในไฟล์ News.php กรณีร้องขอข้อมูล
บางรายการโดยส่ง id เข้ามา เป็นดังนี้
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require(APPPATH.'libraries/REST_Controller.php');

class News extends REST_Controller
{
    public function index_get()
    {
        $data = array(
            array(
                "id"=>1,
                "topic"=>"หัวข้อข่าวที่ 1"
            ),
            array(
                "id"=>2,
                "topic"=>"หัวข้อข่าวที่ 2"
            ),
            array(
                "id"=>3,
                "topic"=>"หัวข้อข่าวที่ 3"
            ),
        );

        // รับค่า parameter กรณี้มีส่งค่าเข้ามา หรือเป็น NULL ถ้าไม่มีการส่งค่า
        $id = $this->get('id');

        if ($id === NULL) // ถ้าไม่มีการระบุ id ที่ต้องการแสดงเข้ามา
        {
            if($data){ // ถ้ามีข้อมูล $data
                $this->response($data, 200);
                // แสดงรายการข่าวทั้งหมด
            }else{ // ถ้าไม่มีข้อมูล
                // กำหนดรูปแบบการแจ้ง เช่น สถานะและข้อความ
                $this->response([
                    'status' => FALSE,
                    'message' => 'ไม่พบรายการข่าว'
                ], REST_Controller::HTTP_NOT_FOUND);
                // NOT_FOUND (404) being the HTTP response code
            }
        }
        else
        {

            $id = (int) $id;  // ให้ id เป็นตัวเลขเท่านั้น

            // ถ้าแปลงเป็นตัวเลขแล้วน้อยกว่าหรือเท่ากับ 0
            if ($id <= 0)
            {
                // รูปแบบ id ไม่ถูกต้อง กำหนดค่าข้อมูลกลับเป็น NULL และสถานะเเป็น 400
                $this->response(NULL, REST_Controller::HTTP_BAD_REQUEST);
                // BAD_REQUEST (400) being the HTTP response code
            }

            $item = NULL; // สร้างตัวแปรว่างไว้รับค่าข้อมูล

            if (!empty($data)) // มีข้อมูล
            {
                foreach ($data as $key => $value) // วนลูปข้อมูล
                {
                    // หารายการที่ id ตรง
                    if (isset($value['id']) && $value['id'] === $id)
                    {
                        $item = $value; // เก็บค่าที่รายการตรง
                    }
                }
            }
            $this->response($item, 200);
            // แสดงเฉพาะรายการ id ที่ตรงตามร้องขอเข้ามา
        }

    }

}
 
 
จากโค้ดที่ปรับแต่งแล้วด้านบน สมมติเราทำการเรียกดูเฉพาะข้อมูลที่ 3 และดูในรูปแบบ
xml โดยกำหนด url เป็นดังนี้
 
http://localhost/learnci/api/news/index/id/3/format/xml
 
เราก็จะได้ข้อมูลตามรูป xml เป็น
 
<?xml version="1.0" encoding="utf-8"?>
<xml>
	<id>3</id>
	<topic>หัวข้อข่าวที่ 3</topic>
</xml>
 
 
 

การทำ RESTful API สำหรับ HTTP POST Request 

เราจะมาลองสมมติกันว่า เราจะส่ง id กับ topic ที่ต้องการเข้าไป
เพื่อแก้ไขข้อมูล แล้วส่งกลับข้อมูลทั้งหมดออกมา เพื่อเทียบดู
เริ่มต้นเราจะใช้ code คล้ายกับส่วนของ GET ฟังก์ชั่น จะได้
ไฟล์ News.php ดังนี้
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require(APPPATH.'libraries/REST_Controller.php');

class News extends REST_Controller
{
    public function index_post()
    {
        $data = array(
            array(
                "id"=>1,
                "topic"=>"หัวข้อข่าวที่ 1"
            ),
            array(
                "id"=>2,
                "topic"=>"หัวข้อข่าวที่ 2"
            ),
            array(
                "id"=>3,
                "topic"=>"หัวข้อข่าวที่ 3"
            ),
        );

        // รับค่า parameter กรณี้มีส่งค่าเข้ามา หรือเป็น NULL ถ้าไม่มีการส่งค่า
        $id = $this->post('id');
        $topic = $this->post('topic');
 //       $this->response($this->post(), 200);

        if ($id === NULL) // ถ้าไม่มีการระบุ id ที่ต้องการแก้ไขส่งเข้ามา
        {
            if($data){ // ถ้ามีข้อมูล $data
                $this->response($data, 200);
                // แสดงรายการข่าวทั้งหมด
            }else{ // ถ้าไม่มีข้อมูล
                // กำหนดรูปแบบการแจ้ง เช่น สถานะและข้อความ
                $this->response([
                    'status' => FALSE,
                    'message' => 'ไม่พบรายการข่าว'
                ], REST_Controller::HTTP_NOT_FOUND);
                // NOT_FOUND (404) being the HTTP response code
            }
        }
        else
        {

            $id = (int) $id;  // ให้ id เป็นตัวเลขเท่านั้น
            $topic = (string) $topic;

            // ถ้าแปลงเป็นตัวเลขแล้วน้อยกว่าหรือเท่ากับ 0
            if ($id <= 0)
            {
                // รูปแบบ id ไม่ถูกต้อง กำหนดค่าข้อมูลกลับเป็น NULL และสถานะเเป็น 400
                $this->response(NULL, REST_Controller::HTTP_BAD_REQUEST);
                // BAD_REQUEST (400) being the HTTP response code
            }

            if (!empty($data)) // มีข้อมูล
            {
                foreach ($data as $key => $value) // วนลูปข้อมูล
                {
                    // หารายการที่ id ตรง
                    if (isset($value['id']) && $value['id'] === $id)
                    {
                        $data[$key]['topic']=$topic; // กำหนดค่าเป็นค่าใหม่
                    }
                }
            }
            $this->response($data, 200);
            // แสดงรายการทั้งหมดกลับอักครั้งหลังอัพเดท
        }
    }

}
 
 
เมื่อสร้าง RESTful API สำหรับรับค่า POST แล้ว เราจะทดสอบเรียกดูข้อมูล 
โดยเราจะใช้ Requests for PHP จากเนื้อหา
 
เรียกใช้ Requests for PHP สำหรับใช้งาน HTTP library ใน codeigniter 
http://www.ninenik.com/content.php?arti_id=701 via @ninenik
 
จะได้เป็นไฟล์ตัวอย่างการดึงข้อมูล ดังนี้ ไฟล์ Example.php ในโฟลเดอร์ apps > controllers
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Example extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->library('PHPRequests');
    }

    public function index(){
        $url = 'http://localhost/learnci/api/news/index';
        $headers = array('Content-Type' => 'application/json');
        $data = array(
            'id' => 3,
            'topic'=>"ใหม่ หัวข้อข่าวที่ 3 อัพเดท"
        );
        $response = Requests::post($url, $headers, json_encode($data));
        $responseData = $response->body; // ได้ข้อมูล json กลับมา
        // แปลงข้อมูลกลับ และให้เป็น array
        $arrData = json_decode($responseData,true);
        echo "<pre>";
        print_r($arrData); // ทดสอบแสดงข้อมูลจากตัวแปร array
        echo "</pre>";
    }

}
 
เมื่อเราทดสอบรันไฟล์ผ่าน url 
http://localhost/learnci/example/
เราก็จะได้ผลลัพธ์โครรงสร้างของ array ดังรูปด้านล่าง
 
Array
(
    [0] => Array
        (
            [id] => 1
            [topic] => หัวข้อข่าวที่ 1
        )

    [1] => Array
        (
            [id] => 2
            [topic] => หัวข้อข่าวที่ 2
        )

    [2] => Array
        (
            [id] => 3
            [topic] => ใหม่ หัวข้อข่าวที่ 3 อัพเดท
        )

)
 
เราจะเห็นว่า รายการ id = 3 ที่เราได้ส่งข้อมูลไปทำการอัพเดท 
ทำให้ค่าที่คืนกลับมาเป็นค่าตามที่เราส่งเข้าไปอัพเดทนั่นเอง
 
เนื้อหาเกี่ยวกับการใช้งาน Rest Server สำหรับ CodeIgniter ข้างต้นทั้งสองตอน
เป็นแนวทางเบื้องต้น ให้เราเข้าใจการใช้งานและนำไปประยุกต์เพิ่มเติม เพื่อสร้าง
RESTful API หรือเป็น web service สำหรับต่อยอดด้านอื่นๆ ได้
ส่วนการสร้าง RESTful API สำหรับ PUT และ DELETE นั้นจะไม่ขอกล่าวถึง แต่มีรูปแบบ
คล้ายกับ GET และ POST และเนื่องจาก PUT และ DELETE ไม่ค่อยนิยมใช้กันมากนัก
โดยสามารถประยุกต์ใช้ POST แทนเพื่อทำการเพิ่มข้อมูล และลบข้อมูลแทนได้



เนื้อหาที่เกี่ยวข้อง



Tags:: phprequests restful codeigniter

เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   





URL สำหรับอ้างอิง