การใช้งาน IncomingRequest ใน CodeIgniter 4

บทความเมื่อ 2 - 3 วันก่อน โดย Ninenik Narkdee
negotiation codeigniter 4 codeigniter request incomingrequest

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



จากเนื้อหาตอนที่ผ่านมา เราได้รู้จักกับ Controller ไปแล้ว
และได้พูดถึงส่วนของ Request Object ที่มักจะถูกเรียกใช้งาน
บ่อยใน Controller ทบทวนตอนที่แล้วได้ที่
    รู้จักกับ Controller และ Controller Filter ใน CodeIgniter 4 http://niik.in/997 
 
เนื้อหาตอนต่อไปนี้ เราจะมาดูเกี่ยวกับ IncomingRequest ซึ่งเป็นส่วนของ Request Object
 
 

รู้จักับ IncomingRequest

    เมื่อมีการเรียกไปยังหน้าเพจหรือเว็บไซต์ใดๆ ก็จะเกิด HTTP Request ขึ้น และการ request ก็เป็นไปได้
ใน 2 ลักษณะ คือ การเปิดหน้าเพจของเว็บไซต์ผ่านบราวเซอร์ เราเรียกว่า Incoming และ การส่งคำสั่งอย่าง เช่น
การใช้งานคำสั่ง CURL จากเว็บไซต์ของเราไปยังเว็บไซต์อื่น เราเรียกว่า Outgoing และเนื้อหานี้เราก็จะพูดถึง
การใช้งาน IncomingRequest หรือการเรียกใช้งานเว็บไซต์ปกตินั่นเอง
    ในการใช้งาน IncomingRequest ใน CI4 จะใช้ IncomingRequest Class ซึ่งสืบทอดมาจาก Request Class และ
Message Class อีกที ดังนั้น เราจึงสามารถใช้คำสั่งต่างๆ ของ parent  class ทั้งสองได้
 
 

การเรียกใช้งาน Request

    การใช้งาน Request instance ใน Controller เราสามารถเรียกใช้งานผ่านคำสั่ง $this->request
ดูตัวอย่าง hellowrold conatroller ด้านล่าง
 
<?php namespace App\Controllers; 

use CodeIgniter\Controller; // เรียกใช้งาน Controller class

class Helloworld extends Controller 
{
    public function index() 
    {
		echo $this->request->getMethod(); // get
    }
}
 
    ข้างต้น เราทำการเรียกใช้งาน request โดยให้ทำคำสั่ง getMethod() เพื่อดูว่า เมื่อเรียกมายัง path URL นี้
เป็นการเรียกผ่าน HTTP method อะไร และแน่นอนว่าค่าก็จะเป็น get นั่นเอง
 
    ในกรณีที่เราไม่ได้ทำการเรียกใช้งาน Request instance ใน Controller เราสามารถกำหนดการเรียกใช้ในรูปแบบดังนี้
 
$request = \Config\Services::request();
 
   เท่านี้เราก็จะสามารถเรียกใช้งาน Request instance ภายนอก Controller ได้
 
    กรณีที่เราต้องการส่งค่า Request instance ไปใช้งานใน class ใดๆ เราสามารถสร้าง property ใน class นั้น แล้วรับค่า
Request instance ที่ส่งเข้าไป ไปใช้งานต่อได้ ตามรูปแบบตัวอย่างด้านล่าง
 
<?php
use CodeIgniter\HTTP\RequestInterface;

class SomeClass
{
    protected $request; // กำหนด property ของ class

    public function __construct(RequestInterface $request)
    {
		// กำหนดให้ Request instance ที่ส่งเข้ามาไว้ในตัวแปร $this->request 
        $this->request = $request; 
    }
}

// ตัวอย่างการใช้งาน
// ในขั้ยตอนการเรียกใช้งาน SomeClass class เราทำการส่งค่า Request instance เข้าไปใช้งานด้วย
$someClass = new SomeClass(\Config\Services::request());
 
 

    การตรวจสอบชนิดของการ Request ที่ส่งเข้ามา

    เราสามารถใช้ Request instance ตรวจสอบชนิดของการ request เช่น เป็นการ request หรือเรียกใช้งานผ่าน Ajax
หรือการเรียกใช้งานผ่าน command line หรือ CLI โดยใช้คำสั่ง isAJAX() และ isCLI() ดังนี้
 
// Check for AJAX request.
if ($this->request->isAJAX())
{
    // ...
}

// Check for CLI Request
if ($this->request->isCLI())
{
    // ...
}
 
    ใน CI4 การที่จะบอกได้ว่า เรียกใช้งานผ่าน Ajax จริงหรือไม่นั้น ขึ้นอยู่กับว่ามีการกำหนด header ในส่วนของค่า
X-Requested-With มาด้วยหรือไม่ และเพื่อให้สามารถระบุได้ว่าเป็นการเรียกใช้งานผ่าน Ajax และมี XHR requests
เข้ามา เราสามารถกำหนดการเรียกใช้งาน Ajax โดยระบุ header ดังนี้
    ตัวอย่างด้านล่าง เป็นรูปแบบการใช้งาน Ajax ผ่าน Fetch API กับ ผ่าน Jquery หรือ JavaScript Framework
 
การกำหนดใน Fetch API
fetch(url, {
    method: "get",
    headers: {
      "Content-Type": "application/json",
      "X-Requested-With": "XMLHttpRequest"
    }
});
 
การกำหนดใน jQuery
$.ajax({
    url: "your url",
    headers: {'X-Requested-With': 'XMLHttpRequest'}
});
 
   เรายังสามารถตรวจสอบได้ว่า เป็นการเรียกใช้งานผ่าน HTTPS หรือไม่โดยใช้คำสั่ง isSecure() ตามรูปแบบดังนี้
ตัวอย่างโค้ดด้านล่าง เป็นการตรวจสอบว่า ถ้าไม่ได้เข้าใช้งานผ่าน HTTPS ให้ทำการ Redirect ไปใช้งานผ่าน HTTPS
ให้โดยอัตโนมัติ
 
if (! $this->request->isSecure())
{
    force_https(); // Global function เปลี่ยนไปใช้งานผ่าน https อัตโนมัติ
}
 
 
    เราอาจจะใช้ค่าจาก HTTP method ในการกำหนดเงื่อนไขการทำงานได้ 
 
// Returns 'get'
$method = $this->request->getMethod();
 
    ปกติคำสั่ง getMethod() จะคือค่าเป็น HTTP method ในรูปแบบตัวพิมพ์เล็ก ถ้าเราต้องการให้เป็นค่า ตัวพิมพ์ใหญ่
ให้กำหนดค่า true เข้าไป
 
// Returns 'GET'
$method = $this->request->getMethod(true);
 
    ตัวอย่างการกำหนดเงื่อนไขการทำงานด้วยคำสั่ง getMethod() ก็เช่น สมมติให้ทำงานเฉพราะ กรณีมีการส่งค่าแบบ
POST มาเท่านั้น ก็จะได้เป็นดังนี้
 
if ($this->request->getMethod() === 'post'){
	// 
}
 
 

    การรับค่า Input

    เราสามารถรับค่า Input ที่ถูกส่งเข้ามาผ่าน Request object จากตัวแปรต่างๆ ไม่ว่าจะเป็น $_SERVER, $_GET, $_POST
$_ENV และ $_COOKIE โดยค่าที่ส่งเข้ามา จะยังไม่มีการคัดกรองใดๆ เป็นข้อมูลดิบที่ส่งมากับ request 
การใช้งาน คำสั่งของ Request object จะช่วยให้เราสามารถเรียกใช้งาน ค่าจากตัวแปรต่างๆ ข้างต้นได้สะดวกยิ่งขึ้น แทนการ
เรียกใช้งานผ่านตัวแปรโดยตรง ตัวอย่างที่เห็นได้ชัด เช่น สมมติเราตรวจสอบว่ามีตัวแปร นี้เป็นค่าว่างหรือไม่
 
if(!empty($_POST['name'])){
    echo $_POST[name'];
}
 
    ถ้าหากค่าที่ส่งมาเป็นตัวแปรชื่อ $_POST['nickname'] โค้ดข้างต้นก็จะกลายเป็นการเรียกใช้งานตัวแปรที่ยังไม่ได้กำหนด
    แต่ถ้าเราใช้งานผ่านคำสั่ง หรือ method ของ Request object ดังนี้
 
if (!empty($this->request->getPost('name')))
{
	echo $this->request->getPost('name');
}
 
    ค่าของคำสั่ง 
 
$this->request->getPost('name')
 
    จะมีค่าเท่ากับ
 
isset($_POST['name']) ? $_POST['name'] : NULL
 
    ข้อมูลจะถูกคัดกรองเบื้องต้น ว่ามีการกำหนดค่าหรือส่งค่าตัวแปรนี้มหรือไม่ ถ้ามีก็ใช้ค่านั้น ถ้าไม่มีก็ให้เป็นค่า NULL
 
    การรับค่า Input ของแต่ละค่า สามารถใช้คำสั่ง ได้ดังนี้
 
    $this->request->getGet() // รับค่าจากตัวแปร $_GET
    $this->request->getPost() // รับค่าจากตัวแปร $_POST
    $this->request->getServer() // รับค่าจากตัวแปร $_SERVER
    $this->request->getCookie() // รับค่าจากตัวแปร $_COOKIE
    $this->request->getEnv() // รับค่าจากตัวแปร $_ENV
 
    กรณีที่ค่า Input นั่นอาจจะเป็นจากตัวแปร $_GET $_POST หรือ $_COOKIE ค่าใดๆ ก็ได้ ที่ส่งค่ามา
เราสามารถใช้คำสั่ง getVar() ได้ มีค่าคล้ายกับการเรียกผ่านตัวแปร $_REQUEST
 
   $this->request->getVar() // รับค่าจากตัวแปร $_GET $_POST $_COOKIE ถ้าใดๆ ที่มี
 
    หรือกรณี รองรับสองค่าเป็น $_GET กับ $_POST  โดยพิจารณาจากคำที่ระบุก่อน ก็จะใช้เป็น
 
    $this->request->getPostGet() // เช็คและรับค่าจากตัวแปร $_POST ก่อน ถ้าไม่มีไปที่ตัวแปร $_GET 
    $this->request->getGetPost() // เช็คและรับค่าจากตัวแปร $_GET ก่อน ถ้าไม่มีไปที่ตัวแปร $_POST
 
 

    การรับค่าข้อมูล JSON

    เราสามารถรับข้อมูลจาก php://input ในรูปแบบ JSON stream ด้วยคำสังสั่ง getJSON() โดยเรียกใช้งาน
ในลักษณะดังนี้
 
$json = $this->request->getJSON();
 
    โดยปกติแล้วจะได้ค่ากลับมาเป็น Object ใดๆ ในรูปแบบ JSON  หากต้องการใช้งานเปฺ็น array ให้กำหนด ค่า 
parameter แรกเป็น true เข้าไป เช่น getJSON(true) 
     สามารถกำหนด parameter ที่ สอง และ สาม เป็นค่า depts และ option ของการใช้งานคำสั่ง json_decode() 
ใน PHP ได้ ตัวอย่างเช่น
 
$json = $this->request->getJSON(true, 512, JSON_BIGINT_AS_STRING);
 
    อย่างไรก็ตาม เราไม่สามารถรู้ได้ว่าข้อมูลที่ถูกส่งมานั้นเป็นรูปแบบ JSON ที่ถูกต้องหรือไม่ ดังนั้น เราจะใช้คำสั่งนี้
ก็ต่อเมื่อ เรามั่นใจ หรือรู้อยู่แล้วว่าข้อมูลนั้นมีรูปแบบเป็น JSON ที่ถูกต้อง
 
 

    การรับข้อมูล Raw Data (เรียกผ่าน method PUT, PATCH, DELETE)

    เราสามารถรับข้อมูลจาก php://input ที่เป็นข้อมูล Raw stream ด้วยคำสั่ง getRawInput() โดยเรียกใช้งาน
ในลักษณะดังนี้
 
$data = $this->request->getRawInput();
 
    โดยจะรับค่าและแปลงเป็นรูปแบบ array ใสลักษณะดังนี้
 
$data = $this->request->getRawInput();
var_dump($data);
 
    ข้อมูลที่ได้ เป็นรูปแบบ array
 
[
    'Param1' => 'Value1',
    'Param2' => 'Value2'
]
 
 

    การกรองข้อมูล Input

    ในการรับค่าข้อมูล Input ที่ได้อธิบายไปด้านบน เราสามารถทำการ filter หรือกรองข้อมูลให้มีความถูกต้องหรือมีความ
ปลอดภัยของข้อมูล โดยการเพิ่ม parameter ตัวที่สองเข้าไปในการเรียกใช้งานการรับค่า input data ดังนี้
 
$email = $this->request->getVar('email', FILTER_SANITIZE_EMAIL); 
 
    ค่า FILTER_SANITIZE_EMAIL ที่เรากำหนด เป็นค่าจากการใช้งานฟังก์ชั่น filter_var() ใน PHP โดยเป็นส่วนหนึ่ง
ของค่า valid filter types
    เราสามารถกำหนดรูปแบบข้างต้นได้ทั้ง getGet() getPost() และรูปแบบอื่นๆ ที่ได้กล่าวไปแล้วด้านบน ยกเว้นเฉพาะ
คำสั่ง getJSON() ที่ไม่สามารถเรียกใช้งานการกำหนดส่วนนี้ได้
 
 

    การรับค่า Headers

    เราสามารถับค่าต่างๆ ของ headers โดยใช้คำสั่ง  getHeaders() โดยจะคืนค่าเป็น array ของข้อมูล header ทั้งหมด
ในรูปแบบชื่อ header และ ค่าของมัน ตัวอย่างเช่น
 
$headers = $this->request->getHeaders();
var_dump($headers);
 
    ตัวอย่างผลลัพธ์ข้อมูลที่ได้
 
[
    'Host'          => CodeIgniter\HTTP\Header,
    'Cache-Control' => CodeIgniter\HTTP\Header,
    'Accept'        => CodeIgniter\HTTP\Header,
]
 
    แต่ถ้าเราต้องการระบุเฉพาะชื่อ header ที่ต้องการ ก็สามารถใช้คำสั่ง getHeader() โดยกำหนดชื่อ header ไว้ใน
parameter แรก เป็นแบบ case-insensitive ไม่ฟิก์ตัวพิมพ์เล็กหรือพิมพ์ใหญ แค่ให้ชื่อตรง  แต่ถ้ากำหนดชื่อไม่ตรง
กับค่าที่มี ก็จะคืนค่าเป็น null  ตัวอย่าง
 
// ตัวอย่างข้างล่าง ได้ผลลัพธ์เหมือนกัน
$host = $this->request->getHeader('host');
$host = $this->request->getHeader('Host');
$host = $this->request->getHeader('HOST');
 
    กรณีเราต้องการตรวจสอบ หรือกำหนดเงื่อนว่า มี header ที่ต้องการหรือไม่ ก็ใช้คำสั่ง hasHeader() ในรูปแบบดังนี้
 
if ($this->request->hasHeader('DNT')) // ถ้ามี header ชื่อนี้
{
    // Don't track something...
}
 
    เรายังสามารถแสดงค่าของ header ในลักษณะข้อความในบรรทัดเดียวด้วยคำสั่ง getHeaderLine() ตัวอย่างเช่น
 
// Accept-Encoding: gzip, deflate, sdch
echo 'Accept-Encoding: '.$request->getHeaderLine('accept-encoding');
 
 

    การรับค่า Request URL

    ค่า URI Object จะแสดงอยู่ใน URL ที่เรากำลังเรียกใช้งานหรือแสดงอยู่ โดยเราสามารถใช้ค่า URL property ผ่านการ
เรียกใช้งาน $this->request->url เราสามารถแสดง URL เต็มโดยใช้คำสั่ง
 
 
$uri = (string)$this->request->uri;
echo $uri;
 
 
    จะแสดงข้อมูล URL เต็มที่เรากำลังเรียกใช้งาน หรือก็คือ ค่า URL เดียวกันที่แสดงใน address bar ของบราวเซอร์
    ใน URI Object เราสามารถรับค่าแยกเป็นส่วนๆ ตามต้องการได้ดังนี้
 
$uri = $this->request->uri;

echo $uri->getScheme();         // http
echo $uri->getAuthority();      // snoopy:password@example.com:88
echo $uri->getUserInfo();       // snoopy:password
echo $uri->getHost();           // example.com
echo $uri->getPort();           // 88
echo $uri->getPath();           // /path/to/page
echo $uri->getQuery();          // foo=bar&bar=baz
echo $uri->getSegments();       // ['path', 'to', 'page']
echo $uri->getSegment(1);       // 'path'
echo $uri->getTotalSegments();  // 3
 
    เราสามารถใช้ค่าส่วนต่างๆ เหล่านี้ ไปเป็นเงื่อนการทำงานเพิ่มเติมใน Controller ได้ตามต้องการ
 
 

    การรับค่าไฟล์ ที่อัพโหลด

    เราสามารถดูข้อมูลไฟล์ที่ทำการอัพโหลดผ่นการเรียกใช้งานคำสั่ง $this->request->getFiles() ซึ่งคืนค่า
เป็น FileCollection instance ดูตัวอย่างการใช้งานเบื้องต้นด้านล่าง
 
$files = $this->request->getFiles();

// กำหนดชื่อฟิลด์ของ input ไฟล์ ที่ต้องการตรวจสอบ
if ($files->hasFile('uploadedFile')) // มีการอัพโหลดไฟล์
{
    $file = $files->getFile('uploadedfile'); // ดูข้อมูลไฟล์ที่อัพโหลด

    // Generate ชื่อไฟล์ที่บันทึกหรือใช้งาน กรณีเพื่อความปลอดภัย
    $name = $file->getRandomName();

    // ย้ายไฟล์ที่อัพโหลดไปยัง path ที่ต้องการ
    $file->move('/path/to/dir', $name);

    echo $file->getSize('mb');      // 1.23 ตัวอย่างการดูข้อมูลขนาดไฟล์
    echo $file->getExtension();     // jpg ตัวอย่างการดูข้อมูลนามสกุลของไฟล์
    echo $file->getType();          // image/jpg ตัวอย่างการดูข้อมูลชนิดของไฟล์
}
 
    ซึ่งในกรณีของการอัพโหลดทีละไฟล์หรือไฟล์เดียว เราสามารถใช้รูปแบบคำสั่งดังนี้
 
$files = $this->request->getFile('uploadedfile');
 
    สำหรับกรณีอัพโหลดพร้อมกับแบบหลายไฟล์ โดยการกำหนด multiple ให้กับ input file จะใช้รูปแบบดังนี้
 
$files = $this->request->getFileMultiple('uploadedfile');

 
 

การใช้งาน Content Negotiation

    ค่า Content Negotiation เปรียบเสมือนเป็นค่าที่บอกว่า client สามารถรองรับข้อมูลเนื้อหาใดได้บ้าง แล้ว server
ควรจัดการกับข้อมูลหรือเนื้อหานั้นๆ ให้ตรงกับความต้องการของ client  ยกตัวอย่างเช่น client หรือผู้ใช้ร้องขอข้อมูล
ที่เป็น HTML หรือ JSON   หรือแม้แต่การร้องข้อมูลรูปภาพว่า ต้องการให้แสดงเป็นไฟล์รูปนามสกุลอะไร jpg หรือ png 
เหล่านี้เป็นต้น
    เราสามารถจัดการค่าส่วนนี้ผ่านคำสั่ง negotiate() ในรูปแบบดังนี้
 
$contentType = $this->request->negotiate('media', ['text/html', 'text/xml']);
echo $contentType;
 
    ข้างต้นเป็นการเรียกใช้งานผ่าน IncomingRequest 
    แต่ถ้าเราต้องการเรียกใช้งานแบบกำหนดเองผ่าน service class ก็สามารถปรับเป็น
 
$negotiate = \Config\Services::negotiator();
$contentType = $negotiate->media(['text/html', 'text/xml']);
echo $contentType;
 
    หรือ แบบการเรียกใช้งานผ่าน service ฟังก์ชั่นก็จะเป็นดังนี้
 
$negotiate = service('negotiator');
$contentType = $negotiate->media(['text/html', 'text/xml']);
echo $contentType;
 
    การกำหนดข้างต้นเป็นการบอกว่า server รองรับข้อมูลในรูปแบบ html และ xml ถ้า client เรียกมายัง URL ใดๆ ปกติ
ก็จะเป็น Request ในลักษณะ 
 
GET /hellowrold HTTP/1.1
Accept: text/html
 
    นั่นคือ client ร้องขอข้อมูลมา และบอกว่า สามารถรับ ( Acecpt ) เป็น HTML 
    ในฝั่ง server ก็กำหนดขนิดของข้อมูล ที่สามารถส่งกลับให้กับ client ได้ว่ามีอะไร ซึ่งถ้าตรงกัน ค่าตัวแปร $contentType
ก็จะเท่ากับ text/html นั่นหมายถึงว่า ทั้ง client และ server ได้ทำข้อตกลงของเนื้อหาข้อมูลกันเรียบร้อยนั่นเอง
 
    แต่สมมติว่า client ร้องขอข้อมูลเป็น  JSON ในรูปแบบ
 
GET /hellowrold HTTP/1.1
Accept: application/json
 
    แต่ server รองรับเฉพาะ html กับ xml ค่าตัวแปร $contentType ก็จะเป็นค่าแรกที่กำหนด คือ text/html
    หรือก็คือ client ร้องขอเป็น JSON แต่ server ไม่รองรับ จึงส่งข้อมูลที่รองรับลำดับแรกกลับไป เป็น html 
 
    ตัวอย่างการกำหนดค่า Content Negotiation ใน 4 ส่วนของชนิดข้อมูล สามารถทำได้ดังนี้
 
 

    Media

    โดย client ส่ง "Accept" header มาประมาณนี้
 
GET /helloworld HTTP/1.1
Accept: application/json
 
    แล้ว server กำหนด ค่าที่รองรับ เป็นดังนี้
 
$supported = [
    'application/json',
    'text/html',
    'application/xml'
];

$format = $this->request->negotiate('media', $supported);
// หรือ
$format = $negotiate->media($supported);
 
    กรณีค่าไม่ตรงกัน จะใช้ค่าแรกหรือ application/json ส่งกลับ ดังนั้น หรือเราต้องการใช้ค่าใดเป็น default ให้กำหนด
เป็น array ใน key แรก หรือกำหนดในค่าแรก เช่น ต้องการให้ html เป็นค่าหลัก ก็กำหนดเป็น
 
$supported = [
    'text/html',
    'application/json',
    'application/xml'
];
 
    กรณีเราไม่ต้องการใช้ค่าใดๆ หากที่ client ร้องขอ ไม่ตรงกับที่ server รองรับ สามารถกำหนดค่า true ต่อท้ายไป โดยจะมีผล
ทำให้ ค่าที่คืนกลับเป็นค่าว่าง แทนที่จะเป็นค่าที่ server รองรับค่ารอง
 
$format = $this->request->negotiate('media', $supported, true);
// หรือ
$format = $negotiate->media($supported, true);
 
 

    Language

    โดย client ส่ง "Accept-Language" header มาประมาณนี้
 
GET /helloworld HTTP/1.1
Accept-Language: fr; q=1.0, en; q=0.5
 
    แล้ว server กำหนด ค่าที่รองรับ เป็นดังนี้
 
$supported = [
    'en',
    'de'
];

$lang = $this->request->negotiate('language', $supported);
// หรือ
$lang = $negotiate->language($supported);
 
    กรณีค่าไม่ตรงกัน จะใช้ค่าแรกที่กำหนดเป็นค่าหลัก คือ "en" จะเป็นค่าที่คืนกลับ หรือค่าของตัวแปร $lang 
 
 

    Encoding

    โดย client ส่ง "Accept-Encoding" header มาประมาณนี้
 
GET /helloworld HTTP/1.1
Accept-Encoding: compress, gzip
 
    แล้ว server กำหนด ค่าที่รองรับ เป็นดังนี้
 
$type = $this->request->negotiate('encoding', ['gzip']);
// หรือ
$type = $negotiate->encoding(['gzip']);
 
    เป็นรูปแบบการบีบอัดไฟล์ที่ server รองรับ ใน apache จะรองรับเฉพาะ gzip
 
 

    Character Set

    โดย client ส่ง "Accept-Charset" header มาประมาณนี้
 
GET /helloworld HTTP/1.1
Accept-Charset: utf-16, utf-8
 
    แล้ว server กำหนด ค่าที่รองรับ เป็นดังนี้
 
$charset = $this->request->negotiate('charset', ['utf-8']);
// หรือ
$charset = $negotiate->charset(['utf-8']);
 
    ถ้าไม่ตรงกัน จะใช้ค่า utf-8 แทน
 
 
    เนื้อหาตอนนี้เราได้รุ้จักกับการใช้งาน IncomingRequest ที่เมื่อใช้งานจริง เราจำเป็นต้องใช้งานนี้เสมอ การทำความเข้าใจส่วน
ต่างๆ เบื้องต้น จะทำให้เราสามารถนำมาปรับประยุกต์เพิ่มติมต่อไป


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



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









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






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

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



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




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











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