ตัว status code เหมือนเป็นผลลัพธ์ของ request ที่ส่งกลับไปยังผู้ใช้ โดยอาจหมายความว่า request ส่งสำเร็จหรือมีข้อผิดพลาดอะไร ซึ่งมี status code ที่แตกต่างกันซึ่งระบุถึงความสำเร็จ ข้อผิดพลาดหรือว่าผู้ใช้ต้องการทำอะไร (เช่น redirect ไปหน้าอื่น)
เช่นเดียวกับ request HTTP response ประกอบด้วยข้อมูลเพิ่มเติมที่เรียกว่า HTTP header เนื้อหาของข้อมูลเดียวกันสามารถส่งกลับมาได้หลายรูปแบบเช่น HTML, XML หรือ JSON และ Content-Type header ใช้ Internet Media Types เช่น text / html เพื่อบอกผู้ใช้ว่ารูปแบบข้อมูลแบบใดที่ส่งกลับมา
Symfony and HTTP Fundamentals
Request and Response in HTTP
HTTP (Hypertext Transfer Protocol) เป็นภาษาข้อความที่ช่วยให้เครื่องสองเครื่องสามารถสื่อสารกันได้ ตัวอย่างเช่นเมื่อผู้ใช้ขอข้อมูลการ์ตูน xkcd ตอนล่าสุดผ่านบราวเซอร์ การสนทนาต่อไปนี้ (โดยประมาณ) จะเกิดขึ้น:
HTTP คือคำที่ใช้เพื่ออธิบายภาษาที่ใช้ข้อความแบบง่าย ๆ นี้ เป้าหมายของเซิร์ฟเวอร์ของคุณคือการทำความเข้าใจคำขอ (request) ข้อความและตอบกลับ (response) เสมอ
Step 1: The Client Sends a Request
ทุกการสนทนาบนเว็บไซต์เริ่มต้นด้วย request โดย request คือข้อความที่ผู้ใช้สร้างขึ้น (เช่น a browser, a smartphone app เป็นต้น) ในรูปแบบพิเศษที่เรียกว่า HTTP ผู้ใช้ส่งคำขอไปยังเซิฟเวอร์และรอการตอบกลับ
ดูส่วนแรกของการโต้ตอบ (คำขอ) ระหว่างเบราว์เซอร์และเว็บเซิร์ฟเวอร์ xkcd:
คำขอ HTTP นี้จะมีลักษณะดังนี้:
ข้อความง่าย ๆ นี้จะสื่อสารทุกอย่างที่จำเป็นเกี่ยวกับทรัพยากรที่ผู้ใช้ร้องขอ บรรทัดแรกของคำขอ HTTP มีความสำคัญมากที่สุดเนื่องจากมีสองสิ่งสำคัญคือ HTTP method (GET) และ URI (
/
)URI (เช่น
/
,/contact
เป็นต้น) เป็นที่อยู่ที่ระบุรีซอร์สที่ผู้ใช้ต้องการ โดย HTTP method (เช่นGET
) กำหนดว่าผู้ใช้ต้องการจะทำอะไรกับรีซอร์ส โดย HTTP method กำหนดวิธีการทั่วไปบางอย่างที่ผู้ใช้สามารถทำงานได้กับรีซอร์ส ซึ่งเมธอดของ HTTP ส่วนใหญ่ ได้แก่GET เข้าถึงข้อมูลจากเซิฟเวอร์ (เช่น ตอนเข้าหน้าเว็บ)
POST สร้างข้อมูลบนเซิฟเวอร์ (เช่น ตอน submit form)
PUT/PATCH อัพเดทข้อมูลบนเซิฟเวอร์ (โดยใช้ APIs)
DELETE ลบข้อมูลจากเซิฟเวอร์ (โดยใช้ APIs)
ด้วยเหตุนี้จึงสามารถจินตนาการว่าคำขอ HTTP ในการลบรายการบล็อกที่เฉพาะเจาะจงอาจดูเหมือนตัวอย่างนี้ เช่น:
นอกเหนือจากบรรทัดแรกแล้วคำขอ HTTP ยังประกอบด้วยบรรทัดข้อมูลอื่น ๆ ที่เรียกว่า Header ส่วน Header สามารถจัดหาข้อมูลได้หลากหลาย เช่น โฮสต์ของรีซอร์สที่ร้องขอ (
Host
), response format ที่ผู้ใช้ต้องการ (Accept
) และแอพพลิเคชันที่ไคลเอนใช้เพื่อทำ request (User-Agent
)Step 2: The Server Returns a Response
เมื่อเซิฟเวอร์ได้รับ request มันจะรู้ว่าผู้ใช้ต้องการข้อมูลอะไร (ผ่าน URI) และรู้ว่าผู้ใช้ต้องการทำอะไรกับข้อมูล (ผ่านทางเมธอด) ตัวอย่างเช่น ในกรณี GET request เซิฟเวอร์เตรียมข้อมูลและส่งกลับในรูป HTTP response ลองพิจารณาการตอบกลับของ xkcd web server ดังรูป
แปลเป็น HTTP response ที่ส่งกลับไปยังเบราเซอร์จะมีลักษณะดังนี้:
response ของ HTTP ประกอบด้วยข้อมูลที่ร้องขอ (กรณีนี้คือเนื้อหา HTML) รวมทั้งข้อมูลอื่น ๆ เกี่ยวกับการ response บรรทัดแรกมีความสำคัญเป็นพิเศษเนื่องจากมีรหัสสถานะการตอบกลับ HTTP (ในกรณีนี้ status code 200)
ตัว status code เหมือนเป็นผลลัพธ์ของ request ที่ส่งกลับไปยังผู้ใช้ โดยอาจหมายความว่า request ส่งสำเร็จหรือมีข้อผิดพลาดอะไร ซึ่งมี status code ที่แตกต่างกันซึ่งระบุถึงความสำเร็จ ข้อผิดพลาดหรือว่าผู้ใช้ต้องการทำอะไร (เช่น redirect ไปหน้าอื่น)
เช่นเดียวกับ request HTTP response ประกอบด้วยข้อมูลเพิ่มเติมที่เรียกว่า HTTP header เนื้อหาของข้อมูลเดียวกันสามารถส่งกลับมาได้หลายรูปแบบเช่น HTML, XML หรือ JSON และ Content-Type header ใช้ Internet Media Types เช่น text / html เพื่อบอกผู้ใช้ว่ารูปแบบข้อมูลแบบใดที่ส่งกลับมา
Requests, Responses and Web Development
การตอบโต้ของ request-response เป็นกระบวนการพื้นฐานที่ขับเคลื่อนการสื่อสารทั้งหมดบนเว็บ
ข้อเท็จจริงที่สำคํญที่สุด ไม่ว่าภาษาอะไรที่คุณใช้ หรือประเภทของแอพพลิเคชั่นที่คุณพัฒนา (web, mobile, JSON API) หรือปรัชญาที่คุณยึดถือในการพัฒนา เป้าหมายสุดท้ายของการพัฒนาแอพพลิเคชั่นคือการเข้าใจแต่ละ request ที่ส่งมาและตอบกลับแต่ละ request นั้นด้วย response ที่เหมาะสม
Requests and Responses in PHP
แล้วคุณจะทำงานกับ "request" และสร้าง "response" อย่างไรเมื่อใช้ PHP
แอพพลิเคชันขนาดเล็กนี้ใช้ข้อมูลจาก HTTP request และใช้เพื่อสร้าง HTTP response แทนที่จะแยกวิเคราะห์ข้อความ HTTP request โดย PHP เตรียมตัวแปรแบบ superglobal (เช่น
$_SERVER
และ$_GET
) ที่มีข้อมูลทั้งหมดจาก request ในทำนองเดียวกันแทนที่จะส่งคืนข้อความที่จัดรูปแบบ HTTP reponse คุณสามารถใช้ฟังก์ชันheader
ของ PHP เพื่อสร้าง header response และแสดงเนื้อหาจริงที่ระบุไว้ โดย PHP จะสร้าง HTTP response และส่งคืนให้กับผู้ใช้Requests and Responses in Symfony
เพื่อช่วยให้คุณสามารถทำงานกับ HTTP request และ response ได้ง่ายขึ้น ใน Symfony จะทำงานผ่าน 2 class ได้แก่
1. Symfony Request Object
คลาส
request
เป็นการนำเสนอข้อมูลเชิงวัตถุของข้อความ HTTP requestคลาส
request
ส่วนมากการทำงานจะอยู่ในส่วนเบื้องหลัง ตัวอย่างเช่น เมธอดisSecure()
จะตรวจสอบค่าที่แตกต่างกันสามค่าใน PHP ซึ่งสามารถระบุได้ว่าผู้ใช้เชื่อมต่อผ่านการเชื่อมต่อที่ปลอดภัยหรือไม่ (HTTPS)2. Symfony Response Object
Symfony ยังมีคลาส
reponse
การแสดง PHP แบบง่าย ๆ ของข้อความ HTTP response ซึ่งจะทำให้แอพพลิเคชันสามารถใช้อินเทอร์เฟซเชิงวัตถุเพื่อสร้าง response ที่จำเป็นต้องส่งกลับไปยังผู้ใช้นอกจากนี้ยังมีคลาสย่อยของ response ที่ช่วยให้คุณสามารถส่งคืนข้อมูล JSON, redirect, stream file downloads และอื่น ๆ ได้
The Journey from the Request to the Response
เช่นเดียวกับ HTTP เอง การใช้ออบเจ็กต์
request
และresponse
ทำได้ง่าย ส่วนที่ยากในการสร้างแอปพลิเคชันคือการเขียนสิ่งที่มาถึงระหว่างทาง กล่าวอีกนัยหนึ่งงานจริง ๆ คือการเขียนโค้ดที่ตีความข้อมูล request และสร้าง response ตอบกลับโดยแอพพลิเคชั่นสามารถทำงานได้หลายอย่าง เช่น ส่งอีเมลล์, จัดการฟอร์ม, เก็บข้อมูลลงฐานข้อมูล, แสดงหน้าเว็บเพจและป้องกันเนื้อหาด้วยการรักษาความปลอดภัย โดยเราสามารถจัดการสิ่งเหล่านี้ได้อย่างไรโดยที่ยังคงสามารถบำรุงรักษา Code ไว้ได้ด้วย
The Front Controller
ในสมัยก่อน แอพพลิเคชั่นสร้างโดยการแบ่งหน้าของเว็บไซต์ออกเป็นแต่ละหน้า (เช่น
index.php
,contact.php
, เป็นต้น)มีปัญหาหลายประการเกี่ยวกับแนวทางนี้ รวมทั้งความยืดหยุ่นของ URL (จะทำอย่างไรถ้าคุณต้องการเปลี่ยน blog.php เป็น news.php โดยไม่ทำลายลิงก์ทั้งหมดของคุณ) อีกทั้งข้อเท็จจริงที่ว่าแต่ละไฟล์ต้องรวมชุดไฟล์หลักไว้ด้วยตนเองเพื่อการรักษาความปลอดภัย การเชื่อมต่อฐานข้อมูล จึงจะสามารถทำให้ "รูปลักษณ์" ของเว็บไซต์สามารถคงที่ได้
โดยทางแก้ปัญหาที่ดีคือการใช้ front controller คือไฟล์ PHP เดี่ยว ๆ ที่จะจัดการทุก request ที่ส่งไปยังแอพพลิเคชั่นของคุณ ตัวอย่างเช่น
ตอนนี้ ทุก request จะได้รับการจัดการอย่างเดียวกัน แทนที่จะใช้ URL ที่ต่างกันในการเรียกใช้ไฟล์ PHP ต่างกัน โดย front controller จะเป็นตัวจัดการการทำงานอยู่เสมอ และการกำหนดเส้นทางของ URL ที่แตกต่างกันไปยังส่วนต่าง ๆ ของแอพพลิเคชันจะจัดการทำงานอยู่ภายใน
ตัวอย่างแบบง่าย ๆ ของ front controller ดังรูป
The Symfony Application Flow
Symfony framework ใช้ไฟล์ front controller แต่ภายใน Symfony รับผิดชอบในการจัดการ request ที่เข้ามาแต่ละรายการและหาว่าจะทำอย่างไร
โดยแต่ละ request ที่เข้ามาจะถูกแปลงโดย Routing component และส่งไปยัง PHP function จากนั้นก็จะส่ง
Response
object กลับไปนี่อาจยังไม่สมเหตุสมผล แต่หากคุณได้ศึกษาต่อไป คุณจะได้เรียนรู้เกี่ยวกับ routes และ controller ซึ่งเป็น 2 ส่วนพื้นฐานในการสร้างหน้าเพจ แต่ในขณะที่คุณทำงานไป อย่าลืมว่าไม่ว่าแอปของคุณจะมีความซับซ้อนมากแค่ไหนงานของคุณก็ยังคงเหมือนเดิม คือ อ่านข้อมูลจาก request และใช้มันสร้าง response ส่งกลับไป
Summary: The Request-Response Flow
source