การรับ JSON Request จาก Client
ในบทที่แล้ว เราได้เรียนรู้วิธีการสร้าง JSON response และส่งกลับไปยัง Client คราวนี้ เราจะมาดูวิธีการรับ JSON request จาก Client ในฝั่ง Server (PHP) กันบ้าง ซึ่งเป็นส่วนสำคัญในการสร้าง API ที่สามารถรับข้อมูลจาก Client ได้อย่างถูกต้อง
ทำไมต้องรับ JSON Request?
Client มักจะส่งข้อมูลมาในรูปแบบ JSON เมื่อต้องการส่งข้อมูลที่มีโครงสร้างซับซ้อน เช่น ข้อมูลที่มีหลาย field หรือข้อมูลที่เป็น array การรับ JSON request ทำให้เราสามารถจัดการข้อมูลเหล่านี้ได้อย่างสะดวกและมีประสิทธิภาพ
การอ่านข้อมูลจาก php://input
เมื่อ Client ส่งข้อมูลมาในรูปแบบ JSON โดยทั่วไป ข้อมูลนั้นจะถูกส่งมาใน body ของ HTTP request เราสามารถเข้าถึงข้อมูลนี้ได้โดยใช้ php://input ซึ่งเป็น stream ที่อ่านข้อมูลดิบจาก request body ได้
ตัวอย่าง:
<?php
// อ่านข้อมูลจาก php://input
$json_data = file_get_contents('php://input');
// แสดงข้อมูล (เพื่อตรวจสอบ)
echo "JSON data received: " . $json_data . "<br>";
?>
คำอธิบาย:
file_get_contents('php://input'): อ่านข้อมูลทั้งหมดจาก streamphp://inputและเก็บไว้ในตัวแปร$json_dataecho "JSON data received: " . $json_data . "<br>";: แสดงข้อมูลที่ได้รับ (เพื่อตรวจสอบว่าเราได้รับข้อมูลถูกต้อง)
ข้อควรจำ: php://input จะว่างเปล่าถ้า request method ไม่ใช่ POST, PUT หรือ PATCH หรือถ้า enctype ของ POST request เป็น multipart/form-data
การใช้ json_decode()
เมื่อเราได้ข้อมูล JSON มาแล้ว เราต้องแปลง JSON string ให้เป็น PHP array หรือ object เพื่อให้เราสามารถเข้าถึงข้อมูลภายในได้ เราจะใช้ฟังก์ชัน json_decode() ในการแปลง JSON string เป็น PHP data structure
ตัวอย่าง:
<?php
// อ่านข้อมูลจาก php://input
$json_data = file_get_contents('php://input');
// แปลง JSON string เป็น PHP object
$data = json_decode($json_data);
// แสดงข้อมูล name จาก object
echo "Name: " . $data->name . "<br>";
// แปลง JSON string เป็น PHP associative array
$data_array = json_decode($json_data, true);
// แสดงข้อมูล email จาก array
echo "Email: " . $data_array['email'] . "<br>";
?>
คำอธิบาย:
$data = json_decode($json_data);: แปลง JSON string เป็น PHP object ถ้าไม่มี parameter ที่สอง$data->name: เข้าถึงค่าของ fieldnameใน object$data$data_array = json_decode($json_data, true);: แปลง JSON string เป็น PHP associative array โดยการใส่ parameter ที่สองเป็นtrue$data_array['email']: เข้าถึงค่าของ fieldemailใน array$data_array
ความแตกต่างระหว่าง Object และ Array:
- Object: เหมาะสำหรับข้อมูลที่ต้องการเข้าถึงด้วยชื่อ field โดยตรง (เช่น
$data->name) - Array: เหมาะสำหรับข้อมูลที่ต้องการเข้าถึงด้วย index หรือชื่อ field (เช่น
$data_array['email']) และเหมาะสำหรับ loop
การตรวจสอบ Error
ฟังก์ชัน json_decode() อาจจะ return null ถ้ามี error เกิดขึ้นในการแปลง JSON string ดังนั้นเราควรตรวจสอบ error ก่อนที่จะใช้งานข้อมูลที่แปลงแล้ว เราสามารถใช้ฟังก์ชัน json_last_error() และ json_last_error_msg() เพื่อตรวจสอบ error ที่เกิดขึ้น
ตัวอย่าง:
<?php
// อ่านข้อมูลจาก php://input
$json_data = file_get_contents('php://input');
// แปลง JSON string เป็น PHP object
$data = json_decode($json_data);
// ตรวจสอบ error
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON error: " . json_last_error_msg() . "<br>";
} else {
// แสดงข้อมูล name จาก object
echo "Name: " . $data->name . "<br>";
}
?>
คำอธิบาย:
json_last_error(): return ค่า error code ล่าสุดที่เกิดขึ้นจากการใช้json_decode()JSON_ERROR_NONE: เป็น constant ที่ระบุว่าไม่มี error เกิดขึ้นjson_last_error_msg(): return ข้อความอธิบาย error ล่าสุดที่เกิดขึ้น
Error Codes ที่พบบ่อย:
JSON_ERROR_NONE: No error has occurredJSON_ERROR_DEPTH: The maximum stack depth has been exceededJSON_ERROR_STATE_MISMATCH: Invalid or malformed JSONJSON_ERROR_CTRL_CHAR: Control character error, possibly incorrectly encodedJSON_ERROR_SYNTAX: Syntax errorJSON_ERROR_UTF8: Malformed UTF-8 characters, possibly incorrectly encodedJSON_ERROR_RECURSION: One or more recursive references in the value to be encodedJSON_ERROR_INF_OR_NAN: One or more NAN or INF values in the value to be encodedJSON_ERROR_UNSUPPORTED_TYPE: A value of a type that cannot be encoded was givenJSON_ERROR_INVALID_PROPERTY_NAME: A property name that cannot be encoded was givenJSON_ERROR_UTF16: Single unpaired UTF-16 surrogate in unicode escape contained in the JSON string passed to json_decode()JSON_ERROR_NOT_STANDALONE: Standalone JSON text not allowedJSON_ERROR_MALFORMED_NUMBER: Malformed numberJSON_ERROR_FRACTION_MISSING: Fraction missing
ตัวอย่างการส่ง JSON Request จาก Client (JavaScript):
const data = {
name: "John Doe",
email: "john.doe@example.com"
};
fetch("your_api_endpoint.php", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => {
console.log("Success:", data);
})
.catch((error) => {
console.error("Error:", error);
});
คำอธิบาย:
JSON.stringify(data): แปลง JavaScript object เป็น JSON string"Content-Type": "application/json": กำหนด HTTP header เพื่อระบุว่า body เป็น JSON
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการรับ JSON request จาก Client ใน PHP โดยใช้ php://input, json_decode() และการตรวจสอบ error ที่อาจเกิดขึ้น การเข้าใจวิธีการเหล่านี้เป็นพื้นฐานสำคัญในการสร้าง API ที่สามารถรับข้อมูลจาก Client ได้อย่างถูกต้องและปลอดภัย ในบทต่อไป เราจะมาเรียนรู้วิธีการจัดการ error ใน API อย่างละเอียด