On this page
วันที่ 28 — API
เรียนรู้พื้นฐาน API และโปรโตคอล HTTP เพื่อเตรียมพร้อมสร้าง RESTful API ด้วย Python

Application Programming Interface (API)
API
API ย่อมาจาก Application Programming Interface ประเภทของ API ที่เราจะครอบคลุมในส่วนนี้คือ Web APIs ซึ่งเป็น interface ที่กำหนดไว้สำหรับการโต้ตอบระหว่างองค์กรและแอปพลิเคชันที่ใช้ทรัพยากรขององค์กรนั้น ซึ่งยังเป็น Service Level Agreement (SLA) เพื่อระบุ functional provider และเปิดเผย service path หรือ URL สำหรับผู้ใช้ API
ในบริบทของการพัฒนาเว็บ API หมายถึงชุดของ specifications เช่น Hypertext Transfer Protocol (HTTP) request messages พร้อมกับนิยามของโครงสร้าง response messages ซึ่งมักอยู่ในรูปแบบ XML หรือ JavaScript Object Notation (JSON)
Web API ได้ย้ายออกจาก Simple Object Access Protocol (SOAP) based web services และ service-oriented architecture (SOA) มาสู่รูปแบบ representational state transfer (REST) style web resources ที่ตรงไปตรงมากกว่า
บริการ Social media และ Web APIs ช่วยให้ชุมชนเว็บสามารถแชร์เนื้อหาและข้อมูลระหว่างชุมชนและ platform ต่าง ๆ ได้
การใช้ API ทำให้เนื้อหาที่สร้างในที่หนึ่งสามารถ post และอัปเดตไปยังหลาย ๆ ตำแหน่งบนเว็บได้แบบ dynamic
ตัวอย่างเช่น Twitter REST API ช่วยให้นักพัฒนาสามารถเข้าถึงข้อมูลหลักของ Twitter และ Search API ให้เมธอดสำหรับนักพัฒนาในการโต้ตอบกับ Twitter Search และข้อมูล trends
แอปพลิเคชันมากมายมี API endpoints ตัวอย่าง API ได้แก่ countries API และ cat's breed API ในส่วนนี้เราจะครอบคลุม RESTful API ที่ใช้ HTTP request methods เพื่อ GET, PUT, POST และ DELETE ข้อมูล
การสร้าง API
RESTful API คือ application program interface (API) ที่ใช้ HTTP requests เพื่อ GET, PUT, POST และ DELETE ข้อมูล ในส่วนก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับ Python, Flask และ MongoDB แล้ว เราจะนำความรู้ที่ได้มาพัฒนา RESTful API โดยใช้ Python Flask และฐานข้อมูล MongoDB ทุกแอปพลิเคชันที่มีการทำ CRUD (Create, Read, Update, Delete) จะมี API สำหรับสร้างข้อมูล ดึงข้อมูล อัปเดตข้อมูล หรือลบข้อมูลออกจากฐานข้อมูล
เพื่อสร้าง API ควรเข้าใจ HTTP protocol และวงจร HTTP request และ response
HTTP (Hypertext Transfer Protocol)
HTTP เป็น communication protocol ที่กำหนดไว้ระหว่าง client และ server โดย client ในกรณีนี้คือ browser และ server คือที่ที่คุณเข้าถึงข้อมูล HTTP เป็น network protocol ที่ใช้ส่ง resources ซึ่งอาจเป็นไฟล์บน World Wide Web ไม่ว่าจะเป็น HTML files, image files, query results, scripts หรือ file types อื่น ๆ
Browser เป็น HTTP client เพราะมันส่ง requests ไปยัง HTTP server (Web server) ซึ่งจะส่ง responses กลับมายัง client
โครงสร้างของ HTTP
HTTP ใช้ client-server model โดย HTTP client เปิด connection และส่ง request message ไปยัง HTTP server และ HTTP server จะส่ง response message กลับมาซึ่งประกอบด้วย resources ที่ร้องขอ เมื่อวงจร request-response เสร็จสิ้น server จะปิด connection

รูปแบบของ request และ response messages จะคล้ายกัน ทั้งสองประเภทมี:
- บรรทัดเริ่มต้น (initial line)
- header lines ศูนย์บรรทัดหรือมากกว่า
- บรรทัดว่าง (เช่น CRLF โดยตัวมันเอง)
- message body ที่ไม่บังคับ (เช่น ไฟล์ หรือ query data หรือ query output)
มาดูตัวอย่าง request และ response messages โดยการนำทางไปที่ site: https://thirtydaysofpython-v1-final.herokuapp.com/ site นี้ถูก deploy บน Heroku free dyno และในบางเดือนอาจไม่ทำงานเนื่องจาก request จำนวนมาก สนับสนุนงานนี้เพื่อให้ server ทำงานตลอดเวลา

Initial Request Line (Status Line)
Initial request line แตกต่างจาก response โดย request line มีสามส่วนคั่นด้วยช่องว่าง:
- ชื่อ method (GET, POST, HEAD)
- path ของ resource ที่ร้องขอ
- version ของ HTTP ที่ใช้ เช่น GET / HTTP/1.1
GET เป็น HTTP ที่ใช้บ่อยที่สุดช่วยให้ get หรือ read resource และ POST เป็น request method ทั่วไปสำหรับสร้าง resource
Initial Response Line (Status Line)
Initial response line ที่เรียกว่า status line ก็มีสามส่วนคั่นด้วยช่องว่างเช่นกัน:
- HTTP version
- Response status code ที่แสดงผลลัพธ์ของ request และเหตุผลที่อธิบาย status code เช่น HTTP/1.0 200 OK หรือ HTTP/1.0 404 Not Found
Status codes ที่พบบ่อยที่สุด:
- 200 OK: request สำเร็จ และ resource ที่ได้รับ (เช่น ไฟล์หรือ script output) จะถูกคืนค่าใน message body
- 500 Server Error
สามารถดูรายการ HTTP status code ทั้งหมดได้ที่ https://httpstatuses.com/ หรือ https://httpstatusdogs.com/
Header Fields
จากภาพหน้าจอข้างต้น header lines ให้ข้อมูลเกี่ยวกับ request หรือ response หรือ object ที่ส่งใน message body
GET / HTTP/1.1
Host: thirtydaysofpython-v1-final.herokuapp.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Referer: https://thirtydaysofpython-v1-final.herokuapp.com/post
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;q=0.9,fi-FI;q=0.8,fi;q=0.7,en-CA;q=0.6,en-US;q=0.5,fr;q=0.4Message Body
HTTP message อาจมี data body ที่ส่งหลัง header lines ใน response นี่คือที่ที่ requested resource ถูกคืนค่าไปยัง client (การใช้งาน message body ที่พบบ่อยที่สุด) หรืออาจเป็นข้อความอธิบายถ้ามีข้อผิดพลาด ใน request นี่คือที่ที่ข้อมูลที่ผู้ใช้กรอกหรือไฟล์ที่อัปโหลดถูกส่งไปยัง server
ถ้า HTTP message มี body จะมี header lines ใน message นั้นที่อธิบาย body โดยเฉพาะ:
- Content-Type: header บอก MIME-type ของข้อมูลใน body (text/html, application/json, text/plain, text/css, image/gif)
- Content-Length: header บอกจำนวน bytes ใน body
Request Methods
GET, POST, PUT และ DELETE คือ HTTP request methods ที่เราจะนำไปใช้ implement API หรือแอปพลิเคชัน CRUD operation
- GET: GET method ใช้เพื่อ retrieve และรับข้อมูลจาก server ที่กำหนดโดยใช้ URI ที่ระบุ Requests ที่ใช้ GET ควร retrieve ข้อมูลเท่านั้นและไม่ควรมีผลกระทบอื่น ๆ ต่อข้อมูล
- POST: POST request ใช้เพื่อสร้างข้อมูลและส่งข้อมูลไปยัง server เช่น การสร้าง post ใหม่ การอัปโหลดไฟล์ เป็นต้น โดยใช้ HTML forms
- PUT: แทนที่ representation ปัจจุบันทั้งหมดของ target resource ด้วยเนื้อหาที่อัปโหลด และเราใช้มันเพื่อแก้ไขหรืออัปเดตข้อมูล
- DELETE: ลบข้อมูล
แบบฝึกหัด: วันที่ 28
- อ่านเกี่ยวกับ API และ HTTP