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

เขียนเมื่อ 8 ปีก่อน โดย Ninenik Narkdee
phprequests codeigniter 3 codeigniter restful

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ phprequests codeigniter 3 codeigniter restful

ดูแล้ว 10,313 ครั้ง


จากเนื้อหาตอนที่แล้วเราได้รู้จักการใช้งาน 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 
 
จะได้เป็นไฟล์ตัวอย่างการดึงข้อมูล ดังนี้ ไฟล์ 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 แทนเพื่อทำการเพิ่มข้อมูล และลบข้อมูลแทนได้


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









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









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





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ