R Academy · บทเรียน

การสร้างจุดปลายทาง GET และ POST

จัดการพารามิเตอร์ในเส้นทาง สตริงคำค้น และการแยกวิเคราะห์เนื้อหาคำขอ

บทเรียน 2 จาก 413 ขั้นตอน

การสร้างจุดปลายทาง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนะนำ Plumber และ REST
  2. การสร้างจุดปลายทาง GET และ POST
  3. การยืนยันตัวตนและความปลอดภัยของ API
  4. การนำ Plumber API ไปใช้งานจริง
← กลับไปที่ R Academy