การสร้างจุดปลายทาง GET และ POST
จัดการพารามิเตอร์ในเส้นทาง สตริงคำค้น และการแยกวิเคราะห์เนื้อหาคำขอ
การสร้างจุดปลายทาง GET และ POST เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
Plumber คืออะไร
plumber เปลี่ยนฟังก์ชัน R ทั่วไปให้เป็นจุดปลายทาง API ของ HTTP โดยใช้คำอธิบายประกอบในคอมเมนต์พิเศษ ใส่คำอธิบายประกอบให้ฟังก์ชันด้วย #* @get /path แล้ว Plumber จะสร้างเส้นทาง GET ที่เรียกใช้ฟังก์ชันนั้นและส่งคืนผลลัพธ์เป็น JSON
ติดตั้งด้วย install.packages('plumber')
จุดปลายทาง GET แรกของคุณ
API ของ Plumber พื้นฐานจะอยู่ในไฟล์ (เช่น api.R) ใส่คำอธิบายประกอบให้ฟังก์ชันด้วย #* @get ตามด้วยพาธ Plumber จะแปลงค่าที่ฟังก์ชันส่งคืนเป็น JSON โดยอัตโนมัติ
# api.R
# library(plumber)
#
# #* Return a greeting
# #* @get /hello
# function() {
# list(message = 'Hello from Plumber!')
# }
#
# Start with:
# pr <- plumb('api.R')
# pr$run(port = 8000)พารามิเตอร์พาธพร้อมคำใบ้ชนิดข้อมูล
แทรกส่วนของพาธที่เปลี่ยนแปลงได้โดยใช้ไวยากรณ์วงเล็บแหลม: /users/<id:int> Plumber จะแยกวิเคราะห์ส่วนนั้นและส่งเป็นอาร์กิวเมนต์ที่มีชนิดข้อมูลให้ฟังก์ชันของคุณ ชนิดข้อมูลที่รองรับได้แก่ int, dbl และ chr
# #* Get a user by ID
# #* @get /users/<id:int>
# function(id) {
# # id is already an integer
# list(
# user_id = id,
# name = paste('User', id)
# )
# }
#
# GET /users/42 => {"user_id":42, "name":"User 42"}พารามิเตอร์คำค้นหาด้วย #* @param
จัดทำเอกสารสำหรับพารามิเตอร์คำค้นหาด้วย #* @param name Description ชื่อพารามิเตอร์ต้องตรงกับชื่ออาร์กิวเมนต์ของฟังก์ชัน Plumber จะอ่านค่าจากสตริงคำค้นหาโดยอัตโนมัติ — ไม่ต้องแยกวิเคราะห์ด้วยตนเอง
# #* Search users by name
# #* @param name The name to search for
# #* @param limit Maximum results to return
# #* @get /users/search
# function(name = '', limit = '10') {
# limit <- as.integer(limit)
# # query string: /users/search?name=Alice&limit=5
# list(query = name, max = limit)
# }การสร้างจุดปลายทาง POST
ใช้ #* @post /path สำหรับจุดปลายทางที่รับเนื้อหาคำขอ อาร์กิวเมนต์พิเศษ req ช่วยให้เข้าถึงออบเจ็กต์คำขอดิบได้ Plumber จะส่งออบเจ็กต์นี้ให้โดยอัตโนมัติเมื่ออาร์กิวเมนต์ของฟังก์ชันชื่อ req
# #* Create a new user
# #* @post /users
# function(req) {
# body <- jsonlite::fromJSON(req$postBody)
# # body$name, body$email are now available
# list(
# status = 'created',
# user_id = sample(1000:9999, 1),
# name = body$name
# )
# }การแยกวิเคราะห์เนื้อหาคำขอ
req$postBody มีสตริง JSON ดิบจากเนื้อหาของ POST ให้แยกวิเคราะห์ด้วย jsonlite::fromJSON(req$postBody) เพื่อให้ได้รายการ R ที่มีชื่อกำกับ ตรวจสอบฟิลด์ที่จำเป็นทุกครั้งก่อนประมวลผล
# #* @post /orders
# function(req, res) {
# body <- jsonlite::fromJSON(req$postBody)
# if (is.null(body$product_id)) {
# res$status <- 400L
# return(list(error = 'product_id is required'))
# }
# list(
# order_id = as.integer(Sys.time()),
# product_id = body$product_id,
# quantity = body$quantity %||% 1
# )
# }รหัสสถานะ HTTP ด้วย res$status
อาร์กิวเมนต์ res (ซึ่ง Plumber ใส่ให้โดยอัตโนมัติเช่นกัน) ช่วยให้คุณกำหนดรหัสสถานะของคำตอบ HTTP ได้ ให้กำหนดค่าก่อนส่งคืนผลลัพธ์: res$status <- 404L รหัสที่พบบ่อยมีดังนี้:
- 200 — OK (ค่าเริ่มต้น)
- 201 — สร้างแล้ว
- 400 — คำขอไม่ถูกต้อง
- 404 — ไม่พบ
- 500 — ข้อผิดพลาดภายในเซิร์ฟเวอร์
# #* @get /items/<id:int>
# function(id, res) {
# items <- list(
# list(id=1, name='Widget'),
# list(id=2, name='Gadget')
# )
# found <- Filter(function(x) x$id == id, items)
# if (length(found) == 0) {
# res$status <- 404L
# return(list(error = paste('Item', id, 'not found')))
# }
# found[[1]]
# }การส่งคืนรายการที่มีชื่อกำกับเป็น JSON
Plumber แปลงค่าที่ R ส่งคืนเป็น JSON โดยใช้ jsonlite รายการที่มีชื่อกำกับจะกลายเป็นออบเจ็กต์ JSON ส่วนรายการที่ไม่มีชื่อกำกับจะกลายเป็นอาร์เรย์ JSON ให้ส่งคืนรายการที่มีชื่อกำกับสำหรับคำตอบที่มีโครงสร้าง
# Named list => JSON object
# list(id=1, name='Alice') => {"id":1, "name":"Alice"}
#
# Unnamed list => JSON array
# list(1, 2, 3) => [1, 2, 3]
#
# Nested structures work too:
# list(
# user = list(id=1, name='Alice'),
# orders = list(list(id=101), list(id=102))
# )
# => {"user":{"id":1,"name":"Alice"}, "orders":[{"id":101},{"id":102}]}ออบเจ็กต์เราเตอร์ของ Plumber
โหลดไฟล์ R ที่มีคำอธิบายประกอบด้วย plumb('api.R') เพื่อสร้างออบเจ็กต์ เราเตอร์ ของ Plumber เรียกใช้ pr$run(port = 8000) เพื่อเริ่มเซิร์ฟเวอร์ ในระบบจริง โดยทั่วไปจะเรียกใช้ pr_run(pr, host='0.0.0.0', port=8000)
# Standard plumber startup in api_start.R:
# library(plumber)
# pr <- plumb('api.R')
# pr$run(port = 8000, host = '0.0.0.0')
#
# Or with pipe style:
# plumb('api.R') |> pr_run(port = 8000)
#
# Test with:
# curl http://localhost:8000/helloการจัดการเมธอด HTTP หลายรายการ
เส้นทางเดียวสามารถรองรับได้หลายเมธอด โดยเขียนฟังก์ชันที่มีคำอธิบายกำกับแยกกัน Plumber จะกำหนดเส้นทางคำขอไปยังฟังก์ชันที่ถูกต้องตามเมธอด HTTP ที่ใช้
# #* List all products
# #* @get /products
# function() {
# list(products = list(list(id=1, name='Widget')))
# }
#
# #* Create a product
# #* @post /products
# function(req) {
# body <- jsonlite::fromJSON(req$postBody)
# list(created = TRUE, name = body$name)
# }การทดสอบจุดปลาย API ของคุณ
ใช้ curl จากเทอร์มินัล หรือใช้ httr2 จาก R เพื่อทดสอบจุดปลายขณะที่เซิร์ฟเวอร์กำลังทำงาน httr2 ช่วยให้คุณเขียนการทดสอบที่ทำซ้ำได้ควบคู่ไปกับโค้ด API ของคุณ
# From terminal:
# curl http://localhost:8000/users/42
# curl -X POST http://localhost:8000/users \
# -H 'Content-Type: application/json' \
# -d '{"name":"Alice","email":"alice@example.com"}'
#
# From R:
# library(httr2)
# resp <- request('http://localhost:8000/users/42') |> req_perform()
# resp_body_json(resp)ตรวจสอบด่วน: พารามิเตอร์เส้นทาง
คุณจะประกาศพารามิเตอร์เส้นทางชื่อ id ซึ่ง Plumber ควรแยกวิเคราะห์เป็นจำนวนเต็มได้อย่างไร
ทบทวนจุดปลาย GET และ POST
การสร้างจุดปลาย REST ด้วย Plumber:
#* @get /pathจะสร้างเส้นทาง GET ส่วน#* @post /pathจะสร้างเส้นทาง POST- พารามิเตอร์เส้นทางใช้ไวยากรณ์
<name:type>(int,dbl,chr) - พารามิเตอร์คำค้นจะถูกแยกวิเคราะห์โดยอัตโนมัติเป็นอาร์กิวเมนต์ของฟังก์ชันที่มีชื่อตรงกัน
- เนื้อความ POST เข้าถึงได้ผ่าน
jsonlite::fromJSON(req$postBody) - กำหนด
res$statusสำหรับการตอบกลับ HTTP ที่ไม่ใช่ 200 - ส่งคืนรายการที่ตั้งชื่อไว้ — ระบบจะแปลงรายการเหล่านี้เป็นออบเจ็กต์ JSON โดยอัตโนมัติ
เรียนรู้ R ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 43
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “การสร้างจุดปลายทาง GET และ POST” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างจุดปลายทาง GET และ POST” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างจุดปลายทาง GET และ POST”
จัดการพารามิเตอร์ในเส้นทาง สตริงคำค้น และการแยกวิเคราะห์เนื้อหาคำขอ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างจุดปลายทาง GET และ POST” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนะนำ Plumber และ REST
- การสร้างจุดปลายทาง GET และ POST
- การยืนยันตัวตนและความปลอดภัยของ API
- การนำ Plumber API ไปใช้งานจริง