跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

การรับ JSON Request จาก Client

การรับ 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'): อ่านข้อมูลทั้งหมดจาก stream php://input และเก็บไว้ในตัวแปร $json_data
  • echo "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: เข้าถึงค่าของ field name ใน object $data
  • $data_array = json_decode($json_data, true);: แปลง JSON string เป็น PHP associative array โดยการใส่ parameter ที่สองเป็น true
  • $data_array['email']: เข้าถึงค่าของ field email ใน 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 occurred
  • JSON_ERROR_DEPTH: The maximum stack depth has been exceeded
  • JSON_ERROR_STATE_MISMATCH: Invalid or malformed JSON
  • JSON_ERROR_CTRL_CHAR: Control character error, possibly incorrectly encoded
  • JSON_ERROR_SYNTAX: Syntax error
  • JSON_ERROR_UTF8: Malformed UTF-8 characters, possibly incorrectly encoded
  • JSON_ERROR_RECURSION: One or more recursive references in the value to be encoded
  • JSON_ERROR_INF_OR_NAN: One or more NAN or INF values in the value to be encoded
  • JSON_ERROR_UNSUPPORTED_TYPE: A value of a type that cannot be encoded was given
  • JSON_ERROR_INVALID_PROPERTY_NAME: A property name that cannot be encoded was given
  • JSON_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 allowed
  • JSON_ERROR_MALFORMED_NUMBER: Malformed number
  • JSON_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 อย่างละเอียด

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务