GET 및 POST 엔드포인트 만들기
경로 매개변수, 쿼리 문자열 및 요청 본문 구문 분석을 처리합니다.
GET 및 POST 엔드포인트 만들기은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Plumber란 무엇입니까
plumber는 특수 주석을 사용하여 일반 R 함수를 HTTP API 엔드포인트로 변환합니다. 함수에 #* @get /path 주석을 작성하면 Plumber가 해당 함수를 호출하는 GET 라우트를 만들고 결과를 JSON으로 반환합니다.
install.packages('plumber')로 설치하십시오.
첫 번째 GET 엔드포인트
기본적인 Plumber API는 파일(예: 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 인수를 통해 원시 요청 객체에 접근할 수 있습니다. 함수 인수의 이름이 req이면 Plumber가 이를 자동으로 전달합니다.
# #* 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에는 POST 본문에서 받은 원시 JSON 문자열이 들어 있습니다. 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
# )
# }res$status를 사용하는 HTTP 상태 코드
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는 jsonlite를 사용하여 R 반환값을 JSON으로 직렬화합니다. 이름이 지정된 목록은 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 라우터 객체
plumb('api.R')로 주석이 달린 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을 사용하거나 R에서 httr2를 사용하여 엔드포인트를 테스트할 수 있습니다. 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)빠른 확인: 경로 매개변수
Plumber가 정수로 파싱하도록 id라는 이름의 경로 매개변수를 어떻게 선언합니까?
GET 및 POST 엔드포인트 복습
Plumber로 REST 엔드포인트 구축하기:
#* @get /path는 GET 경로를 만들고,#* @post /path는 POST 경로를 만듭니다.- 경로 매개변수에는
<name:type>구문(int,dbl,chr)을 사용합니다. - 쿼리 매개변수는 일치하는 함수 인수로 자동 파싱됩니다.
- POST 본문은
jsonlite::fromJSON(req$postBody)를 통해 사용할 수 있습니다. - 200이 아닌 HTTP 응답에는
res$status를 설정합니다. - 이름이 지정된 목록을 반환하면 자동으로 JSON 객체로 직렬화됩니다.
자주 묻는 질문
“GET 및 POST 엔드포인트 만들기” 강의는 무료인가요?
네 — “GET 및 POST 엔드포인트 만들기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“GET 및 POST 엔드포인트 만들기”에서 뭘 배우나요?
경로 매개변수, 쿼리 문자열 및 요청 본문 구문 분석을 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
R Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“GET 및 POST 엔드포인트 만들기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Plumber와 REST 입문
- GET 및 POST 엔드포인트 만들기
- 인증과 API 보안
- Plumber API를 운영 환경에 배포하기