nattapong99 / book

0 stars 0 forks source link

Symfony and HTTP Fundamentals #2

Open nattapong99 opened 6 years ago

nattapong99 commented 6 years ago

Symfony and HTTP Fundamentals

Request and Response in HTTP

HTTP (Hypertext Transfer Protocol) เป็นภาษาข้อความที่ช่วยให้เครื่องสองเครื่องสามารถสื่อสารกันได้ ตัวอย่างเช่นเมื่อผู้ใช้ขอข้อมูลการ์ตูน xkcd ตอนล่าสุดผ่านบราวเซอร์ การสนทนาต่อไปนี้ (โดยประมาณ) จะเกิดขึ้น:

01

HTTP คือคำที่ใช้เพื่ออธิบายภาษาที่ใช้ข้อความแบบง่าย ๆ นี้ เป้าหมายของเซิร์ฟเวอร์ของคุณคือการทำความเข้าใจคำขอ (request) ข้อความและตอบกลับ (response) เสมอ

Step 1: The Client Sends a Request

ทุกการสนทนาบนเว็บไซต์เริ่มต้นด้วย request โดย request คือข้อความที่ผู้ใช้สร้างขึ้น (เช่น a browser, a smartphone app เป็นต้น) ในรูปแบบพิเศษที่เรียกว่า HTTP ผู้ใช้ส่งคำขอไปยังเซิฟเวอร์และรอการตอบกลับ

ดูส่วนแรกของการโต้ตอบ (คำขอ) ระหว่างเบราว์เซอร์และเว็บเซิร์ฟเวอร์ xkcd:

02

คำขอ HTTP นี้จะมีลักษณะดังนี้:

03

ข้อความง่าย ๆ นี้จะสื่อสารทุกอย่างที่จำเป็นเกี่ยวกับทรัพยากรที่ผู้ใช้ร้องขอ บรรทัดแรกของคำขอ HTTP มีความสำคัญมากที่สุดเนื่องจากมีสองสิ่งสำคัญคือ HTTP method (GET) และ URI (/)

URI (เช่น /, /contact เป็นต้น) เป็นที่อยู่ที่ระบุรีซอร์สที่ผู้ใช้ต้องการ โดย HTTP method (เช่น GET) กำหนดว่าผู้ใช้ต้องการจะทำอะไรกับรีซอร์ส โดย HTTP method กำหนดวิธีการทั่วไปบางอย่างที่ผู้ใช้สามารถทำงานได้กับรีซอร์ส ซึ่งเมธอดของ HTTP ส่วนใหญ่ ได้แก่

GET เข้าถึงข้อมูลจากเซิฟเวอร์ (เช่น ตอนเข้าหน้าเว็บ)

POST สร้างข้อมูลบนเซิฟเวอร์ (เช่น ตอน submit form)

PUT/PATCH อัพเดทข้อมูลบนเซิฟเวอร์ (โดยใช้ APIs)

DELETE ลบข้อมูลจากเซิฟเวอร์ (โดยใช้ APIs)

ด้วยเหตุนี้จึงสามารถจินตนาการว่าคำขอ HTTP ในการลบรายการบล็อกที่เฉพาะเจาะจงอาจดูเหมือนตัวอย่างนี้ เช่น:

04

นอกเหนือจากบรรทัดแรกแล้วคำขอ 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 ดังรูป

05

แปลเป็น HTTP response ที่ส่งกลับไปยังเบราเซอร์จะมีลักษณะดังนี้:

06

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

07

แอพพลิเคชันขนาดเล็กนี้ใช้ข้อมูลจาก HTTP request และใช้เพื่อสร้าง HTTP response แทนที่จะแยกวิเคราะห์ข้อความ HTTP request โดย PHP เตรียมตัวแปรแบบ superglobal (เช่น $_SERVER และ $_GET) ที่มีข้อมูลทั้งหมดจาก request ในทำนองเดียวกันแทนที่จะส่งคืนข้อความที่จัดรูปแบบ HTTP reponse คุณสามารถใช้ฟังก์ชัน header ของ PHP เพื่อสร้าง header response และแสดงเนื้อหาจริงที่ระบุไว้ โดย PHP จะสร้าง HTTP response และส่งคืนให้กับผู้ใช้

08

Requests and Responses in Symfony

เพื่อช่วยให้คุณสามารถทำงานกับ HTTP request และ response ได้ง่ายขึ้น ใน Symfony จะทำงานผ่าน 2 class ได้แก่

1. Symfony Request Object

คลาส request เป็นการนำเสนอข้อมูลเชิงวัตถุของข้อความ HTTP request

09

คลาส request ส่วนมากการทำงานจะอยู่ในส่วนเบื้องหลัง ตัวอย่างเช่น เมธอด isSecure() จะตรวจสอบค่าที่แตกต่างกันสามค่าใน PHP ซึ่งสามารถระบุได้ว่าผู้ใช้เชื่อมต่อผ่านการเชื่อมต่อที่ปลอดภัยหรือไม่ (HTTPS)

2. Symfony Response Object

Symfony ยังมีคลาส reponse การแสดง PHP แบบง่าย ๆ ของข้อความ HTTP response ซึ่งจะทำให้แอพพลิเคชันสามารถใช้อินเทอร์เฟซเชิงวัตถุเพื่อสร้าง response ที่จำเป็นต้องส่งกลับไปยังผู้ใช้

10

นอกจากนี้ยังมีคลาสย่อยของ response ที่ช่วยให้คุณสามารถส่งคืนข้อมูล JSON, redirect, stream file downloads และอื่น ๆ ได้

คลาส Request และ Response เป็นส่วนหนึ่งของ standalone component ที่เรียกว่า 
symfony/http-foundation นั้นทำให้สามารถเรียกใช้คลาสนี้ได้ใน project PHP ใด ๆ 
นอกจากนี้ยังมี class สำหรับการจัดการเซสชัน การอัปโหลดไฟล์และอื่น ๆ

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 ที่ส่งไปยังแอพพลิเคชั่นของคุณ ตัวอย่างเช่น

/index.php.         | executes index.php
/index.php/contact  | executes index.php
/index.php/blog     | executes index.php

ตอนนี้ ทุก request จะได้รับการจัดการอย่างเดียวกัน แทนที่จะใช้ URL ที่ต่างกันในการเรียกใช้ไฟล์ PHP ต่างกัน โดย front controller จะเป็นตัวจัดการการทำงานอยู่เสมอ และการกำหนดเส้นทางของ URL ที่แตกต่างกันไปยังส่วนต่าง ๆ ของแอพพลิเคชันจะจัดการทำงานอยู่ภายใน

ตัวอย่างแบบง่าย ๆ ของ front controller ดังรูป

11

The Symfony Application Flow

Symfony framework ใช้ไฟล์ front controller แต่ภายใน Symfony รับผิดชอบในการจัดการ request ที่เข้ามาแต่ละรายการและหาว่าจะทำอย่างไร

12

โดยแต่ละ request ที่เข้ามาจะถูกแปลงโดย Routing component และส่งไปยัง PHP function จากนั้นก็จะส่ง Response object กลับไป

นี่อาจยังไม่สมเหตุสมผล แต่หากคุณได้ศึกษาต่อไป คุณจะได้เรียนรู้เกี่ยวกับ routes และ controller ซึ่งเป็น 2 ส่วนพื้นฐานในการสร้างหน้าเพจ แต่ในขณะที่คุณทำงานไป อย่าลืมว่าไม่ว่าแอปของคุณจะมีความซับซ้อนมากแค่ไหนงานของคุณก็ยังคงเหมือนเดิม คือ อ่านข้อมูลจาก request และใช้มันสร้าง response ส่งกลับไป

Summary: The Request-Response Flow

  1. ผู้ใช้ (บราวเซอร์) ส่ง HTTP request
  2. แต่ละ request จะจัดการที่ไฟล์เดียว (เรียกว่า front controller)
  3. front controller จะเริ่มระบบของ Symfony และส่งต่อข้อมูล request
  4. ภายใน Symfony จะใช้ routes และ controller เพื่อสร้าง response สำหรับหน้าเพจ
  5. Symfony ส่ง response object ไปยังข้อความ header และ content (เช่น HTTP response) ซึ่งจะส่งกลับไปยังผู้ใช้

source