การส่งคำขอ HTTP ด้วย httr2
ส่งคำขอ GET และ POST จัดการส่วนหัว และประมวลผลการตอบกลับ
การส่งคำขอ HTTP ด้วย httr2 เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
บทนำสู่ httr2
httr2 เป็นแพ็กเกจ R สมัยใหม่สำหรับคำขอ HTTP ซึ่งพัฒนาต่อจาก httr โดยใช้รูปแบบตัวสร้างที่อาศัยไพป์: เริ่มด้วย request(url) เพิ่มตัวปรับแต่ง แล้วดำเนินการด้วย req_perform()
library(httr2)
# Basic GET request pattern:
# request(url) -> create request object
# |> req_*() -> modify request
# |> req_perform() -> send request
# |> resp_*() -> extract from response
# Minimal example (requires internet):
# resp <- request('https://httpbin.org/get') |>
# req_perform()
# resp_status(resp) # 200
# resp_body_json(resp) # parsed JSON body
cat('httr2 follows: build -> perform -> extract')request() และ req_perform()
request(url) จะสร้างออบเจ็กต์คำขอ ส่วน req_perform() จะดำเนินการตามคำขอและส่งคืนออบเจ็กต์การตอบกลับ จากนั้นสามารถตรวจสอบการตอบกลับได้ด้วยฟังก์ชัน resp_*
library(httr2)
# Build and send a GET request
# resp <- request('https://httpbin.org/get') |>
# req_perform()
# Inspect response
# resp_status(resp) # 200
# resp_status_desc(resp) # 'OK'
# resp_headers(resp) # list of headers
# resp_header(resp, 'content-type') # single header
# resp_body_string(resp) # raw body as string
# resp_body_json(resp) # parsed JSON
# resp_body_raw(resp) # raw bytes
cat('Response hierarchy:')
cat('status -> headers -> body')req_headers(): ส่วนหัวแบบกำหนดเอง
req_headers() ใช้เพิ่มหรือแทนที่ส่วนหัว HTTP เหมาะสำหรับโทเค็นยืนยันตัวตน การระบุชนิดเนื้อหา ส่วนหัวเวอร์ชัน API และข้อมูลเมตาของคำขอแบบกำหนดเอง
library(httr2)
# Add custom headers
# resp <- request('https://api.example.com/data') |>
# req_headers(
# 'Authorization' = 'Bearer my_token',
# 'X-API-Version' = '2',
# 'Accept' = 'application/json'
# ) |>
# req_perform()
# Common headers:
# 'Content-Type' = 'application/json' for POST with JSON body
# 'Accept' = 'application/json' to request JSON response
# 'User-Agent' = 'MyApp/1.0' for polite identification
# 'X-API-Key' = key for key-based auth
cat('req_headers() sets HTTP request headers')req_url_query(): พารามิเตอร์คำค้น
req_url_query() จะต่อพารามิเตอร์คำค้นเข้ากับ URL อย่างปลอดภัย โดยเข้ารหัสอักขระพิเศษให้ด้วย วิธีนี้สะอาดกว่าการนำสตริงมาต่อกันเองด้วย paste0()
library(httr2)
# Add query parameters
# resp <- request('https://api.example.com/search') |>
# req_url_query(
# q = 'R programming',
# page = 1,
# size = 20,
# sort = 'relevance'
# ) |>
# req_perform()
# Resulting URL:
# https://api.example.com/search?q=R+programming&page=1&size=20&sort=relevance
# Inspect the URL without performing:
req <- request('https://api.example.com/search') |>
req_url_query(q = 'hello world', page = 2)
req$url
# 'https://api.example.com/search?q=hello+world&page=2'คำขอ POST ด้วย req_body_json()
ส่งข้อมูล JSON ในคำขอ POST ด้วย req_body_json() ฟังก์ชันนี้จะตั้งส่วนหัว Content-Type: application/json และทำให้ลิสต์ R เป็น JSON โดยอัตโนมัติ
library(httr2)
# POST request with JSON body
# resp <- request('https://api.example.com/users') |>
# req_method('POST') |>
# req_body_json(list(
# name = 'Alice',
# email = 'alice@example.com',
# role = 'admin'
# )) |>
# req_perform()
# resp_status(resp) # 201 Created (if success)
# resp_body_json(resp) # returned user object
# Other body methods:
# req_body_form(...) -> application/x-www-form-urlencoded
# req_body_raw(bytes) -> raw bytes
# req_body_file(path) -> file upload
cat('req_body_json() handles Content-Type automatically')resp_body_json(): แยกวิเคราะห์การตอบกลับ
resp_body_json() จะแยกวิเคราะห์เนื้อหาการตอบกลับเป็น JSON และแปลงเป็นลิสต์ R ใช้ simplifyVector=TRUE (ค่าเริ่มต้น) เพื่อแปลงอาร์เรย์ JSON เป็นเวกเตอร์ R และออบเจ็กต์เป็นลิสต์ที่มีชื่อโดยอัตโนมัติ
library(httr2)
library(jsonlite)
# Simulated API response handling
# resp <- request('https://api.github.com/users/hadley') |>
# req_perform()
# user <- resp_body_json(resp)
# user$name # 'Hadley Wickham'
# user$public_repos # number of repos
# user$followers # follower count
# For arrays (simplifyVector=TRUE converts to data frame):
# resp <- request('https://api.github.com/users/hadley/repos') |>
# req_perform()
# repos <- resp_body_json(resp, simplifyVector = TRUE)
# repos$name # vector of repo names
cat('resp_body_json() with simplifyVector=TRUE -> data frame')resp_status() และการจัดการข้อผิดพลาด
resp_check_status() จะแจ้งข้อผิดพลาดโดยอัตโนมัติเมื่อได้รับการตอบกลับรหัส 4xx/5xx หากไม่ใช้ฟังก์ชันนี้ httr2 จะไม่แจ้งข้อผิดพลาดสำหรับรหัสสถานะที่ไม่ดี คุณต้องตรวจสอบอย่างชัดเจนหรือเรียกใช้ resp_check_status()
library(httr2)
# Pattern: check status after perform
# resp <- request('https://api.example.com/data') |>
# req_perform() |>
# resp_check_status() # errors on 4xx/5xx
# Manual status checks:
# status <- resp_status(resp)
# if (status == 200) { ... }
# if (status == 404) { stop('Not found') }
# if (status == 401) { stop('Unauthorized') }
# if (status == 429) { Sys.sleep(60); retry() }
# HTTP status codes:
# 200 OK, 201 Created, 204 No Content
# 400 Bad Request, 401 Unauthorized, 403 Forbidden
# 404 Not Found, 429 Rate Limited
# 500 Server Error, 503 Service Unavailable
cat('Always check response status codes')req_retry(): ลองส่งคำขอซ้ำโดยอัตโนมัติ
req_retry() จะลองส่งคำขอที่ล้มเหลวซ้ำโดยอัตโนมัติ ระบุ max_tries และอาจระบุ is_transient เพิ่มเติมได้ ซึ่งเป็นฟังก์ชันที่ใช้ระบุข้อผิดพลาดที่ควรลองใหม่ เช่น 429 หรือ 503 ฟังก์ชันนี้จำเป็นสำหรับไคลเอ็นต์ API ที่ทำงานได้อย่างทนทาน
library(httr2)
# Automatic retry with exponential backoff
# resp <- request('https://api.example.com/data') |>
# req_retry(
# max_tries = 3,
# is_transient = function(resp) {
# resp_status(resp) %in% c(429, 500, 503)
# },
# backoff = ~ 2^.x # exponential: 2, 4, 8 seconds
# ) |>
# req_perform()
# Default retry behavior:
# - Retries on 429 Too Many Requests automatically
# - Uses Retry-After header if present
# - max_tries = 1 by default (no retry)
# Simple retry:
# req_retry(max_tries = 3) # retry up to 3 times total
cat('req_retry() adds resilience to API calls')req_throttle(): จำกัดอัตราการเรียกใช้
req_throttle(rate) ช่วยให้แน่ใจว่าคุณจะไม่เกินอัตราคำขอสูงสุด ส่งค่า rate = n/period (เช่น 10 คำขอต่อนาที) httr2 จะหน่วงเวลาระหว่างคำขอโดยอัตโนมัติตามความจำเป็น
library(httr2)
# Throttle to at most 10 requests per minute
# urls <- paste0('https://api.example.com/items/', 1:50)
# resps <- lapply(urls, function(url) {
# request(url) |>
# req_throttle(rate = 10 / 60) |> # 10/min
# req_perform()
# })
# Alternative: use req_perform_parallel() for parallel
# with throttle built in:
# reqs <- lapply(urls, \(u) request(u))
# resps <- req_perform_parallel(
# reqs,
# on_error = 'continue', # skip failures
# progress = TRUE
# )
cat('req_throttle(rate = 10/60) = 10 req/min')ตัวช่วยยืนยันตัวตน
httr2 มีตัวช่วยยืนยันตัวตนในตัว ได้แก่ req_auth_basic(user, pass) สำหรับการยืนยันตัวตนแบบ Basic, req_auth_bearer_token(token) สำหรับโทเค็นแบบ Bearer และ req_oauth_*() สำหรับกระบวนการ OAuth
library(httr2)
# Bearer token (most common for modern APIs)
# resp <- request('https://api.example.com/data') |>
# req_auth_bearer_token('my_api_token_here') |>
# req_perform()
# Basic authentication
# resp <- request('https://api.example.com/data') |>
# req_auth_basic('username', 'password') |>
# req_perform()
# Store tokens securely in environment variables
# token <- Sys.getenv('MY_API_TOKEN')
# resp <- request('https://api.example.com') |>
# req_auth_bearer_token(token) |>
# req_perform()
cat('Never hardcode tokens in scripts!')
cat('Use Sys.getenv() or the keyring package')ทดลองส่งโดยไม่ส่งจริงด้วย req_dry_run()
req_dry_run() จะแสดงสิ่งที่จะส่งในคำขออย่างละเอียด (เมธอด, URL, ส่วนหัว และเนื้อหา) โดยไม่ส่งคำขอจริง เหมาะอย่างยิ่งสำหรับแก้ไขข้อผิดพลาดของคำขอที่ซับซ้อนก่อนเรียกใช้ API จริง
library(httr2)
# Inspect the request without sending it
req <- request('https://api.example.com/users') |>
req_method('POST') |>
req_headers(
'X-API-Version' = '2',
'Accept' = 'application/json'
) |>
req_auth_bearer_token('my_token') |>
req_body_json(list(name = 'Alice', role = 'admin')) |>
req_url_query(notify = 'true')
# Show request details without sending
req_dry_run(req)
# POST /users?notify=true HTTP/1.1
# Host: api.example.com
# Authorization: Bearer my_token
# Content-Type: application/json
# ...ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับรูปแบบการสร้างคำขอของ httr2
ทบทวน: คำขอ HTTP ด้วย httr2
ประเด็นสำคัญ: httr2 ใช้ตัวสร้างที่อาศัยไพป์: request(url) |> req_*() |> req_perform() เพิ่มส่วนหัวด้วย req_headers() เพิ่มพารามิเตอร์คำค้นด้วย req_url_query() และเพิ่มเนื้อหา JSON ด้วย req_body_json() ยืนยันตัวตนด้วย req_auth_bearer_token() ตรวจสอบสถานะด้วย resp_check_status() เสมอ เพิ่มความทนทานด้วย req_retry() และจำกัดอัตราด้วย req_throttle() แก้ไขข้อผิดพลาดด้วย req_dry_run()
library(httr2)
# Complete httr2 request pattern:
# resp <- request('https://api.example.com/endpoint') |>
# req_headers('Accept' = 'application/json') |>
# req_url_query(param1 = 'value', page = 1) |>
# req_auth_bearer_token(Sys.getenv('API_TOKEN')) |>
# req_retry(max_tries = 3) |>
# req_throttle(rate = 10/60) |>
# req_perform() |>
# resp_check_status()
# Extract data:
# data <- resp_body_json(resp, simplifyVector = TRUE)
cat('build -> authenticate -> perform -> check -> extract')เรียนรู้ R ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 43
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “การส่งคำขอ HTTP ด้วย httr2” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การส่งคำขอ HTTP ด้วย httr2” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การส่งคำขอ HTTP ด้วย httr2”
ส่งคำขอ GET และ POST จัดการส่วนหัว และประมวลผลการตอบกลับ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การส่งคำขอ HTTP ด้วย httr2” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแยกวิเคราะห์ JSON ด้วย jsonlite
- การส่งคำขอ HTTP ด้วย httr2
- การเรียกใช้ REST API ใน R
- การจัดการโครงสร้าง JSON แบบซ้อนกัน