REST API — เป็นรูปแบบสถาปัตยกรรมสำหรับการโต้ตอบระหว่างส่วนประกอบในเครือข่ายแบบกระจาย ซึ่งอิงตามหลักการของ Resource-Oriented Architecture และใช้โปรโตคอล HTTP ในการถ่ายโอนข้อมูล ทรัพยากรแต่ละรายการใน REST ถูกระบุด้วย URL ที่ไม่ซ้ำกันและรองรับชุดการดำเนินการมาตรฐานผ่านวิธี HTTP: GET, POST, PUT, PATCH, DELETE จากข้อมูลของ ProgrammableWeb (2025) กว่า 75% ของ API เว็บสาธารณะทั้งหมดสร้างขึ้นบนสถาปัตยกรรม REST ทำให้เป็นมาตรฐานโดยพฤตินัยสำหรับการพัฒนาแอปมือถือและเว็บ REST ช่วยให้มั่นใจในความสามารถในการปรับขนาด ความเป็นอิสระของไคลเอ็นต์และเซิร์ฟเวอร์ และการแคชที่มีประสิทธิภาพ ซึ่งมีความสำคัญอย่างยิ่งสำหรับแอปพลิเคชันมือถือที่มีการเชื่อมต่อเครือข่ายที่ไม่เสถียร
ประเด็นสำคัญ
REST API (API การถ่ายโอนสถานะเชิงตัวแทน) เป็นรูปแบบสถาปัตยกรรมที่เสนอโดยรอย ฟีลดิงในวิทยานิพนธ์ระดับปริญญาเอกของเขาในปี 2000 โดยกำหนดชุดข้อจำกัดและหลักการสำหรับการออกแบบโปรโตคอลเครือข่าย API ที่ปฏิบัติตามข้อจำกัดเหล่านี้เรียกว่า RESTful REST ไม่ใช่โปรโตคอลหรือมาตรฐาน — เป็นแนวทางทางสถาปัตยกรรมที่ใช้โปรโตคอลที่มีอยู่ (ส่วนใหญ่เป็น HTTP) สำหรับการแลกเปลี่ยนข้อมูลระหว่างไคลเอ็นต์และเซิร์ฟเวอร์
แนวคิดหลักของ REST คือ สถาปัตยกรรมที่เน้นทรัพยากร แทนที่จะเรียกเมธอดบนเซิร์ฟเวอร์ (เช่นใน SOAP หรือ RPC) ไคลเอ็นต์จะดำเนินการกับทรัพยากร: รับรายการ สร้างใหม่ อัปเดตหรือลบ ทรัพยากรแต่ละรายการคือเอนทิตีของโดเมน: ผู้ใช้ คำสั่งซื้อ สินค้า บทความ ทรัพยากรมีสถานะซึ่งถูกส่งไปยังไคลเอ็นต์ในรูปแบบมาตรฐาน โดยปกติคือ JSON เซิร์ฟเวอร์ไม่เก็บสถานะของไคลเอ็นต์ระหว่างคำขอ — นี่คือหลักการ stateless ข้อกำหนดสำคัญของ REST
คุณลักษณะหลักของ REST API:
REST อิงตามข้อจำกัดทางสถาปัตยกรรมหกประการที่ฟีลดิงกำหนดขึ้น การปฏิบัติตามข้อจำกัดเหล่านี้ช่วยให้มั่นใจในความสามารถในการปรับขนาด ประสิทธิภาพ และความง่ายในการรวมระบบ แต่ละหลักการแก้ปัญหาเฉพาะของระบบกระจาย — จากความจำเป็นในการแคชไปจนถึงข้อกำหนดด้านความปลอดภัย มาดูแต่ละหลักการอย่างละเอียดกัน
| หลักการ | คำอธิบาย | ปัญหาที่แก้ไข |
|---|---|---|
| Client-Server | การแยกไคลเอ็นต์และเซิร์ฟเวอร์ วิวัฒนาการอิสระ | การเชื่อมโยงส่วนประกอบ |
| Stateless | แต่ละคำขอมีข้อมูลทั้งหมดสำหรับการประมวลผล | การปรับขนาดเซิร์ฟเวอร์ |
| Cacheable | การตอบสนองถูกทำเครื่องหมายว่าสามารถแคชได้หรือไม่ | การลดภาระเครือข่าย |
| Layered System | ชั้นกลางไม่ปรากฏแก่ไคลเอ็นต์ | ความปลอดภัยและการปรับสมดุลโหลด |
| Uniform Interface | อินเทอร์เฟซเดียว: ทรัพยากร วิธี รหัสสถานะ | การทำให้สถาปัตยกรรมง่ายขึ้น |
| Code on Demand | ตัวเลือก: การส่งโค้ดที่ดำเนินการได้ไปยังไคลเอ็นต์ | การขยายความสามารถฝั่งไคลเอ็นต์ |
หลักการ Uniform Interface ยังรวมข้อจำกัดย่อยสี่ประการ: การระบุทรัพยากรผ่าน URI การจัดการทรัพยากรผ่านตัวแทน ข้อความที่อธิบายตนเองได้ และ HATEOAS (ไฮเปอร์มีเดียเป็นกลไกของสถานะแอปพลิเคชัน) ข้อจำกัดย่อยสุดท้ายมักถูกมองข้ามในทางปฏิบัติ — REST API สมัยใหม่ส่วนใหญ่ไม่ได้ใช้ HATEOAS อย่างสมบูรณ์ ซึ่งนำไปสู่การอภิปรายว่า API ดังกล่าวเป็น RESTful “อย่างแท้จริง” หรือไม่
หลักการ Stateless เป็นหนึ่งในหลักการที่สำคัญที่สุดสำหรับการปรับขนาด การไม่มีเซสชันบนเซิร์ฟเวอร์หมายความว่าอินสแตนซ์เซิร์ฟเวอร์ใดๆ ก็สามารถประมวลผลคำขอใดๆ ได้ ซึ่งช่วยลดความซับซ้อนของการปรับขนาดแนวนอน: เพียงเพิ่มเซิร์ฟเวอร์ใหม่หลังตัวปรับสมดุลโหลด สำหรับแอปพลิเคชันมือถือ stateless ยังหมายความว่าคำขอสามารถส่งไปยังเซิร์ฟเวอร์ CDN ใดก็ได้ ซึ่งมีความสำคัญต่อการเข้าถึงทั่วโลก
แต่ละ วิธี HTTP ใน REST API สอดคล้องกับการดำเนินการเฉพาะบนทรัพยากร: GET สำหรับการอ่าน POST สำหรับการสร้าง PUT สำหรับการอัปเดตทั้งหมด PATCH สำหรับการอัปเดตบางส่วน DELETE สำหรับการลบ ความเป็นเอกภาพ (idempotence) ของวิธีเป็นคุณลักษณะสำคัญ: GET, PUT, DELETE เป็นเอกภาพ (การดำเนินการซ้ำให้ผลลัพธ์เดียวกัน) POST และ PATCH ไม่เป็น นี่เป็นสิ่งสำคัญสำหรับการจัดการข้อผิดพลาดเครือข่ายเมื่อไคลเอ็นต์ไม่ทราบว่าคำขอถึงเซิร์ฟเวอร์หรือไม่
รหัสสถานะ HTTP เป็นส่วนสำคัญของ REST API แต่ละรหัสมีความหมายเฉพาะ: 200 OK สำหรับ GET ที่สำเร็จ 201 Created สำหรับ POST 204 No Content สำหรับ DELETE ที่ไม่มีเนื้อหาการตอบสนอง 400 Bad Request สำหรับข้อมูลไม่ถูกต้อง 401 Unauthorized สำหรับขาดการรับรองตัวตน 404 Not Found สำหรับทรัพยากรไม่พบ การใช้รหัสสถานะอย่างถูกต้องทำให้ API สามารถอธิบายตนเองได้และช่วยให้การดีบักง่ายขึ้น
JSON (สัญกรณ์วัตถุ JavaScript) เป็นรูปแบบหลักสำหรับการถ่ายโอนข้อมูลใน REST API ความนิยมของมันเกิดจากความเรียบง่าย อ่านง่าย และการสนับสนุนดั้งเดิมใน JavaScript JSON ถูกส่งด้วยหัวข้อ Content-Type: application/json ทางเลือกอื่นรวมถึง XML (ละเอียด ล้าสมัย) YAML (สะดวกสำหรับการกำหนดค่า พบน้อยกว่าสำหรับ API) และ Protocol Buffers (ไบนารี มีประสิทธิภาพสำหรับระบบที่มีโหลดสูง)
โครงสร้างของวัตถุ JSON ใน REST API โดยทั่วไปรวมถึงฟิลด์ id, type และแอตทริบิวต์ของทรัพยากร สำหรับคอลเล็กชัน จะใช้อาร์เรย์ JSON พร้อมเมตาดาตาการแบ่งหน้า REST API สมัยใหม่ปฏิบัติตามข้อกำหนด JSON:API (jsonapi.org) หรือ JSON Schema สำหรับการตรวจสอบความถูกต้องของการตอบสนอง การใช้รูปแบบข้อมูลแบบรวมช่วยลดความซับซ้อนของการพัฒนาไลบรารีไคลเอ็นต์และการสร้างเอกสาร
ตัวอย่างการตอบสนอง JSON สำหรับรายการผู้ใช้:
{
"data": [
{
"id": 1,
"name": "อันนา เปโตรวา",
"email": "anna@example.com"
}
],
"meta": {
"total": 42,
"page": 1,
"per_page": 10
}
}
การเลือกรูปแบบการถ่ายโอนข้อมูลส่งผลต่อประสิทธิภาพของแอปพลิเคชันมือถือ JSON ถูกบีบอัดผ่าน GZIP ได้ 70-80% ทำให้ยอมรับได้สำหรับสถานการณ์ส่วนใหญ่ สำหรับแอปพลิเคชันเรียลไทม์ที่มีปริมาณข้อมูลมาก (สตรีมมิ่ง เกม) แนะนำให้เปลี่ยนเป็นโปรโตคอลไบนารีหรือใช้ WebSocket ร่วมกับ Protocol Buffers
มาดูตัวอย่างเชิงปฏิบัติของการทำงานกับ REST API ในฝั่งแอปพลิเคชันมือถือกัน เป็นตัวอย่าง สมมติว่าเรามี API สำหรับทำงานกับคำสั่งซื้อในร้านค้าออนไลน์ สำหรับแต่ละวิธี HTTP จะแสดงคำขอและการตอบสนองที่คาดหวังจากเซิร์ฟเวอร์ ตัวอย่างแสดงโครงสร้าง RESTful API ทั่วไปที่ใช้ในการพัฒนาแอปมือถือ
คำขอเพื่อรับคำสั่งซื้อทั้งหมดของผู้ใช้พร้อมการแบ่งหน้า การตอบสนองประกอบด้วยอาร์เรย์ของวัตถุคำสั่งซื้อและข้อมูลเมตาสำหรับการนำทางระหว่างหน้า พารามิเตอร์ page และ per_page ถูกส่งผ่าน query string
// อินเทอร์เฟซ Retrofit สำหรับ REST API
interface OrderApi {
@GET("api/v1/orders")
suspend fun getOrders(
@Query("page") page: Int = 1,
@Query("per_page") perPage: Int = 20
): Response<OrderListResponse>
}
การสร้างคำสั่งซื้อใหม่ผ่านคำขอ POST เซิร์ฟเวอร์คืนสถานะ 201 Created และวัตถุที่สร้างขึ้นในเนื้อหาการตอบสนอง สำคัญ: การสร้างทำบนคอลเล็กชัน /api/v1/orders ไม่ใช่บนทรัพยากรเฉพาะ — นี่เป็นรูปแบบ RESTful มาตรฐาน
@POST("api/v1/orders")
suspend fun createOrder(
@Body order: CreateOrderRequest
): Response<OrderResponse>
// ตัวอย่างเนื้อหาคำขอ
data class CreateOrderRequest(
val productId: String,
val quantity: Int,
val addressId: String
)
การลบทรัพยากรทำด้วยวิธี DELETE บน URL เฉพาะของคำสั่งซื้อ การลบสำเร็จคืนค่า 204 No Content ความเป็นเอกภาพของ DELETE หมายความว่าคำขอซ้ำไปยัง URL เดียวกันคืนค่า 404 Not Found ซึ่งได้รับการจัดการอย่างถูกต้องบนไคลเอ็นต์
@DELETE("api/v1/orders/{id}")
suspend fun deleteOrder(
@Path("id") orderId: String
): Response<Unit>
// การใช้งานใน ViewModel
fun removeOrder(orderId: String) {
viewModelScope.launch {
val response = api.deleteOrder(orderId)
if (response.isSuccessful) {
showSuccess()
}
}
}
ตัวอย่างเหล่านี้แสดงการนำ REST API ไปใช้ทั่วไปในฝั่ง Android โดยใช้ Retrofit และ Kotlin Coroutines สำหรับแอปพลิเคชัน iOS URLSession หรือไลบรารี Alamofire ร่วมกับโปรโตคอล Codable มีบทบาทคล้ายกัน โครงสร้าง REST API ยังคงเหมือนเดิมโดยไม่ขึ้นกับแพลตฟอร์ม — เฉพาะวิธีการดำเนินการขอเท่านั้นที่เปลี่ยนไป
การออกแบบ RESTful API ที่มีคุณภาพสูงต้องการปฏิบัติตามธรรมเนียมที่ทำให้ API เข้าใจง่ายสำหรับนักพัฒนา ทรัพยากรควรตั้งชื่อด้วยคำนามพหูพจน์ (/users, /orders, /products) วิธี HTTP ควรสะท้อนถึงการดำเนินการ และ URL ควรแสดงลำดับชั้นการซ้อนกัน ข้อผิดพลาดควรคืนค่า JSON ที่เป็นมาตรฐานพร้อมรหัสและข้อความ ไม่ใช่แค่สถานะ HTTP การปฏิบัติตามธรรมเนียมเหล่านี้ช่วยลดอุปสรรคในการเข้าสำหรับนักพัฒนาใหม่และทำให้การรวมระบบง่ายขึ้น
ข้อผิดพลาดทั่วไปอย่างหนึ่งในการออกแบบ REST API คือการซ้อนทรัพยากรมากเกินไป แทนที่จะใช้ /users/1/orders/5/items/3 ควรใช้โครงสร้างแบบราบกับพารามิเตอร์ query: /items?order_id=5&user_id=1 ซึ่งช่วยให้การแคชง่ายขึ้น ไม่ต้องการการดูแลเส้นทางยาวบนเซิร์ฟเวอร์ และจัดทำเอกสารได้ง่ายกว่า สถาปัตยกรรมแบบราบยังเข้ากันได้ดีกว่ากับคำค้นหาแบบกราฟเมื่อย้ายไปใช้ GraphQL ในอนาคต
ความปลอดภัยของ REST API ถูกนำไปใช้ผ่าน การรับรองตัวตน (JWT, OAuth 2.0) และ การอนุญาต ในระดับทรัพยากร แต่ละคำขอต้องตรวจสอบว่าผู้ใช้มีสิทธิ์เข้าถึงทรัพยากรที่ร้องขอหรือไม่ HTTPS เป็นข้อบังคับ — หากไม่มีการเข้ารหัส โทเค็นและข้อมูลจะถูกส่งในรูปแบบข้อความธรรมดา สำหรับแอปพลิเคชันมือถือ แนะนำให้ใช้ OAuth 2.0 กับ PKCE (Proof Key for Code Exchange) เพื่อรับโทเค็นอย่างปลอดภัย
การจัดการเวอร์ชัน ของ REST API จำเป็นสำหรับความเข้ากันได้ย้อนหลังเมื่อมีการเปลี่ยนแปลง วิธีการที่พบบ่อยที่สุดคือ: เวอร์ชันใน URL (/api/v1/orders) เวอร์ชันในหัวข้อ (Accept: application/vnd.myapi.v1+json) และเวอร์ชันในพารามิเตอร์ query (?api_version=1) การจัดการเวอร์ชันด้วย URL เป็นวิธีที่ได้รับความนิยมมากที่สุดเนื่องจากมองเห็นได้ชัดเจนในบันทึกและเอกสาร อย่างไรก็ตาม มันละเมิดหลักการ REST ของ URL เดียวต่อทรัพยากร
การแคช ใน REST API ถูกนำไปใช้ผ่านหัวข้อ HTTP Cache-Control, ETag และ Last-Modified คำขอ GET ที่ถูกทำเครื่องหมายว่าสามารถแคชได้สามารถให้บริการจากแคชของเบราว์เซอร์หรือพร็อกซีโดยไม่ต้องติดต่อเซิร์ฟเวอร์ สำหรับแอปพลิเคชันมือถือ การแคชมีความสำคัญเป็นพิเศษ — ช่วยลดการใช้ข้อมูลและเพิ่มความเร็วในการแสดงข้อมูลที่โหลดไว้ก่อนหน้าเมื่อการเชื่อมต่อไม่ดี ETag คือแฮชของเนื้อหาการตอบสนอง: ไคลเอ็นต์ส่งใน If-None-Match และเซิร์ฟเวอร์คืนค่า 304 Not Modified หากข้อมูลไม่เปลี่ยนแปลง
ทางเลือกสมัยใหม่ของ REST API รวมถึง GraphQL (การดึงข้อมูลที่ยืดหยุ่นฝั่งไคลเอ็นต์) และ gRPC (โปรโตคอลไบนารีบน HTTP/2 สำหรับไมโครเซอร์วิส) อย่างไรก็ตาม REST ยังคงเป็นมาตรฐานหลักสำหรับ API สาธารณะเนื่องจากความเรียบง่าย ความเป็นสากล และการสนับสนุนเครื่องมือที่กว้างขวาง การเลือกระหว่าง REST และทางเลือกอื่นขึ้นอยู่กับข้อกำหนดเฉพาะของโครงการ: ความซับซ้อนของคำค้นหา ปริมาณข้อมูล ความต้องการอัปเดตแบบเรียลไทม์
คำถามที่พบบ่อย
REST คือรูปแบบสถาปัตยกรรม ชุดของหลักการ RESTful คือ API ที่ปฏิบัติตามหลักการเหล่านี้ RESTful API ยึดถือ stateless อินเทอร์เฟซแบบรวม การแคช และสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์
JSON เบากว่า XML (~30% เล็กกว่า) แยกวิเคราะห์เร็วกว่า และมีการสนับสนุนดั้งเดิมใน JavaScript XML ยังคงใช้ใน SOAP และระบบเดิม แต่ JSON เป็นมาตรฐานสำหรับ API บนมือถือ
ใช้ HTTPS สำหรับการเข้ารหัส JWT หรือ OAuth 2.0 สำหรับการรับรองตัวตน เพิ่มการจำกัดอัตรา การตรวจสอบความถูกต้องของอินพุต นโยบาย CORS และการตรวจสอบบทบาทในแต่ละคำขอ
HATEOAS คือหลักการที่การตอบสนองของ API มีลิงก์ไปยังทรัพยากรที่เกี่ยวข้อง ไคลเอ็นต์ “นำทาง” API ผ่านลิงก์เหล่านี้แทน URL ที่รู้จักล่วงหน้า ในทางปฏิบัติ HATEOAS ไม่ค่อยถูกนำไปใช้อย่างสมบูรณ์
หากต้องการ การดึงข้อมูลที่ยืดหยุ่น — เปลี่ยนเป็น GraphQL สำหรับ ประสิทธิภาพสูง ระหว่างไมโครเซอร์วิส — gRPC สำหรับการอัปเดตเรียลไทม์ — WebSocket REST เหมาะสมที่สุดสำหรับ API สาธารณะส่วนใหญ่
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม