R में REST API का प्रयोग
API कुंजियों से प्रमाणीकरण करें, परिणामों को पृष्ठों में बाँटकर प्राप्त करें और API प्रतिक्रियाएँ संग्रहीत करें।
R में REST API का प्रयोग, CoddyKit पर R Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह R Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
REST API की अवधारणाएँ
REST API संसाधन URL पर HTTP विधियों (GET, POST, PUT, DELETE) का उपयोग करते हैं। प्रतिक्रियाएँ आम तौर पर JSON होती हैं। API में प्रमाणीकरण आवश्यक हो सकता है, पृष्ठांकन संभालना पड़ सकता है और अनुरोध दर सीमित की जा सकती है। एक अच्छा R API क्लाइंट इन तीनों को संभालता है।
library(httr2)
# REST API anatomy:
# Base URL: https://api.example.com/v1
# Resources: /users, /products, /orders
# Methods:
# GET /users -> list users
# POST /users -> create user
# GET /users/42 -> get user 42
# PUT /users/42 -> update user 42
# DELETE /users/42 -> delete user 42
# Query parameters for filtering/pagination:
# GET /users?page=2&size=20&sort=name
cat('REST = stateless + resource-based + HTTP methods')Bearer टोकन प्रमाणीकरण
अधिकांश आधुनिक API Bearer टोकन (OAuth 2.0) का उपयोग करते हैं। टोकन को Sys.setenv() से पर्यावरण चर में या .Renviron फ़ाइल में रखें। स्क्रिप्ट में टोकन कभी भी सीधे न लिखें।
library(httr2)
# Store token securely in .Renviron:
# GITHUB_PAT=ghp_your_token_here
# Access at runtime:
token <- Sys.getenv('GITHUB_PAT')
if (nchar(token) == 0) token <- 'demo_token'
# Use in requests:
# resp <- request('https://api.github.com/user') |>
# req_auth_bearer_token(token) |>
# req_headers('Accept' = 'application/vnd.github.v3+json') |>
# req_perform() |>
# resp_check_status()
# result <- resp_body_json(resp)
# result$login # your GitHub username
cat('Token from env:', if(nchar(token)>0) 'found' else 'missing')पुनः उपयोग योग्य API क्लाइंट बनाना
बेस URL, प्रमाणीकरण और त्रुटि प्रबंधन को एक कंस्ट्रक्टर फ़ंक्शन में समाहित करें। प्रत्येक API एंडपॉइंट एक ऐसी विधि बन जाता है जो इस आधार फ़ंक्शन को कॉल करती है — R API पैकेज के लिए यही मानक पैटर्न है।
library(httr2)
# API client constructor
new_api_client <- function(base_url, token) {
list(
base_req = request(base_url) |>
req_auth_bearer_token(token) |>
req_headers('Accept' = 'application/json') |>
req_retry(max_tries = 3)
)
}
# Method: GET /users
get_users <- function(client, page = 1, size = 20) {
resp <- client$base_req |>
req_url_path_append('users') |>
req_url_query(page = page, size = size) |>
req_perform() |>
resp_check_status()
resp_body_json(resp, simplifyVector = TRUE)
}
# client <- new_api_client('https://api.example.com', token)
# users <- get_users(client, page = 1)
cat('Reusable client pattern: base request + methods')resp_link_url() के साथ पृष्ठांकन
कई API पृष्ठांकन के लिए Link हेडर (RFC 5988) का उपयोग करते हैं: प्रतिक्रिया में Link: <url>; rel="next" हेडर शामिल होता है। resp_link_url(resp, 'next') अगले पृष्ठ का URL अपने-आप निकालता है।
library(httr2)
# Generic paginator using Link headers
fetch_all_pages <- function(initial_url, token, max_pages = 50) {
all_results <- list()
next_url <- initial_url
page <- 1
while (!is.null(next_url) && page <= max_pages) {
resp <- request(next_url) |>
req_auth_bearer_token(token) |>
req_perform() |>
resp_check_status()
all_results[[page]] <- resp_body_json(resp, simplifyVector = TRUE)
# Follow Link: <url>; rel='next' header
next_url <- tryCatch(
resp_link_url(resp, 'next'),
error = function(e) NULL
)
page <- page + 1
}
do.call(rbind, all_results)
}
cat('resp_link_url() follows RFC 5988 pagination')कर्सर-आधारित पृष्ठांकन
कुछ API (Twitter, Slack) पृष्ठ संख्या के बजाय कर्सर का उपयोग करते हैं। प्रतिक्रिया में next_cursor या next_page_token फ़ील्ड शामिल होता है। अगले अनुरोध के लिए इसे क्वेरी पैरामीटर के रूप में पास करें।
library(httr2)
# Cursor-based pagination pattern
fetch_cursor_pages <- function(base_url, token, max_pages = 100) {
all_data <- list()
cursor <- NULL
page <- 1
repeat {
req <- request(base_url) |>
req_auth_bearer_token(token)
if (!is.null(cursor))
req <- req |> req_url_query(cursor = cursor)
resp <- req |> req_perform() |> resp_check_status()
body <- resp_body_json(resp)
all_data[[page]] <- body$results
cursor <- body$next_cursor # NULL if last page
if (is.null(cursor) || page >= max_pages) break
page <- page + 1
}
do.call(c, all_data)
}
cat('Cursor pagination: safer for large/changing datasets')त्रुटियों को सहजता से संभालना
उत्पादन API क्लाइंट HTTP त्रुटियों और नेटवर्क विफलताओं को अलग-अलग पकड़ता है। req_perform() के आसपास tryCatch() का उपयोग करें और स्थिति-विशिष्ट प्रबंधन के लिए httr2_http_* त्रुटि कंडीशन की जाँच करें।
library(httr2)
safe_api_call <- function(req) {
tryCatch(
req |> req_perform() |> resp_check_status(),
httr2_http_401 = function(e) {
stop('Authentication failed. Check your token.')
},
httr2_http_403 = function(e) {
stop('Forbidden. Insufficient permissions.')
},
httr2_http_404 = function(e) {
message('Resource not found, returning NULL')
return(NULL)
},
httr2_http_429 = function(e) {
stop('Rate limit exceeded. Try again later.')
},
error = function(e) {
stop(paste('Request failed:', conditionMessage(e)))
}
)
}
cat('Match on specific httr2_http_NNN conditions')API प्रतिक्रियाओं को कैश करना
विकास के दौरान अनावश्यक अनुरोधों से बचने के लिए API प्रतिक्रियाओं को कैश करें। httr2 का req_cache() प्रतिक्रियाओं को डिस्क पर कैश करता है और Cache-Control हेडर का सम्मान करता है। मैन्युअल कैशिंग किसी भी API के लिए काम करती है।
library(httr2)
# httr2 built-in disk cache
# resp <- request('https://api.example.com/static-data') |>
# req_cache(tempdir(), max_age = 3600) |> # 1 hour TTL
# req_perform()
# Manual cache pattern
cached_api_call <- function(url, cache_file, max_age = 3600) {
if (file.exists(cache_file)) {
age <- as.numeric(Sys.time() - file.mtime(cache_file))
if (age < max_age) {
cat('Cache hit\n')
return(readRDS(cache_file))
}
}
cat('Cache miss, fetching...\n')
# result <- resp_body_json(request(url) |> req_perform())
# saveRDS(result, cache_file)
# result
}
cached_api_call('https://example.com/api', 'cache.rds')req_perform_parallel() के साथ समानांतर अनुरोध
req_perform_parallel() कई अनुरोध एक साथ भेजता है, जिससे बैच संचालन में कुल समय बहुत कम हो जाता है। समानांतर निष्पादन के दौरान अनुरोध दर सीमाओं का पालन करने के लिए इसे req_throttle() के साथ मिलाएँ।
library(httr2)
# Build a list of requests
item_ids <- 1:5
reqs <- lapply(item_ids, function(id) {
request(paste0('https://jsonplaceholder.typicode.com/todos/', id))
})
# Execute all in parallel (requires internet)
# resps <- req_perform_parallel(
# reqs,
# on_error = 'continue', # skip failures
# progress = TRUE
# )
# results <- lapply(resps, resp_body_json)
# titles <- sapply(results, function(r) r$title)
# print(titles)
# on_error options:
# 'stop' -> abort on first failure
# 'continue' -> collect errors, keep going
cat('Parallel: much faster for many independent calls')अनुरोध दर सीमाओं के साथ काम करना
API प्रतिक्रिया हेडर के माध्यम से अनुरोध दर की स्थिति बताते हैं: X-RateLimit-Remaining, X-RateLimit-Reset और Retry-After। समझदारी से बैकऑफ़ लागू करने के लिए इन्हें पढ़ें।
library(httr2)
respect_rate_limit <- function(resp) {
# Check remaining calls
remaining <- resp_header(resp, 'x-ratelimit-remaining')
if (!is.na(remaining) && as.integer(remaining) < 5) {
reset_at <- as.integer(
resp_header(resp, 'x-ratelimit-reset')
)
wait_secs <- max(0, reset_at - as.integer(Sys.time()))
cat(sprintf('Rate limit nearly exhausted. Waiting %ds\n', wait_secs))
# Sys.sleep(wait_secs)
}
# Handle 429 Retry-After header
if (resp_status(resp) == 429) {
retry_after <- resp_header(resp, 'retry-after')
cat(sprintf('Rate limited. Retry after %s seconds\n', retry_after))
}
resp
}
cat('Always respect X-RateLimit-* headers')पूर्ण API क्लाइंट: GitHub उदाहरण
सभी बातों को एक साथ लागू करते हुए: एक पूर्ण GitHub API क्लाइंट जो प्रमाणीकरण करता है, पृष्ठांकित रिपॉज़िटरी सूचियाँ प्राप्त करता है और त्रुटियों को संभालता है — अब तक सीखे गए सभी पैटर्न का प्रदर्शन।
library(httr2)
# GitHub API client
github_repos <- function(username, token = NULL, n_pages = 3) {
base <- 'https://api.github.com'
req_base <- request(base) |>
req_headers(
'Accept' = 'application/vnd.github.v3+json',
'User-Agent' = 'R-API-Client/1.0'
)
if (!is.null(token))
req_base <- req_base |> req_auth_bearer_token(token)
all_repos <- list()
for (page in seq_len(n_pages)) {
# resp <- req_base |>
# req_url_path_append('users', username, 'repos') |>
# req_url_query(page = page, per_page = 30, sort = 'updated') |>
# req_perform() |> resp_check_status()
# repos <- resp_body_json(resp, simplifyVector = TRUE)
# if (length(repos) == 0) break
# all_repos[[page]] <- repos
cat(sprintf('Would fetch page %d for %s\n', page, username))
}
do.call(rbind, all_repos)
}
github_repos('hadley')OAuth 2.0 क्लाइंट क्रेडेंशियल
कुछ API में OAuth 2.0 क्लाइंट क्रेडेंशियल प्रवाह आवश्यक होता है: access token के बदले client_id + client_secret का आदान-प्रदान करें। httr2 का oauth_client() और req_oauth_client_credentials() यह काम अपने-आप संभालते हैं।
library(httr2)
# OAuth 2.0 Client Credentials flow:
# client <- oauth_client(
# id = Sys.getenv('CLIENT_ID'),
# secret = Sys.getenv('CLIENT_SECRET'),
# token_url = 'https://auth.example.com/oauth/token'
# )
# Automatic token management:
# resp <- request('https://api.example.com/data') |>
# req_oauth_client_credentials(client) |>
# req_perform()
# httr2 automatically:
# 1. Gets access token using client credentials
# 2. Adds 'Authorization: Bearer <token>' header
# 3. Refreshes token when expired
cat('req_oauth_client_credentials() handles token lifecycle')
cat('Token is cached in memory automatically')त्वरित जाँच
httr2 के साथ R में REST API क्लाइंट बनाने की अपनी समझ जाँचें।
पुनरावलोकन: REST API का उपयोग
मुख्य बातें: बेस URL, प्रमाणीकरण और पुनःप्रयास को कंस्ट्रक्टर में समाहित करके पुनः उपयोग योग्य क्लाइंट बनाएँ। प्रमाणीकरण के लिए req_auth_bearer_token() का उपयोग करें — टोकन पर्यावरण चरों में रखें। resp_link_url() के साथ Link हेडर या कर्सर-आधारित पैटर्न से पृष्ठांकन संभालें। HTTP त्रुटियों को हमेशा resp_check_status() और tryCatch() से संभालें। बैच कॉल के लिए req_perform_parallel() का उपयोग करें। विकास के दौरान परिणामों को कैश करें।
library(httr2)
# REST API client template:
make_api_call <- function(url, token,
method = 'GET',
body = NULL,
query = list()) {
req <- request(url) |>
req_method(method) |>
req_auth_bearer_token(token) |>
req_headers('Accept' = 'application/json') |>
req_retry(max_tries = 3) |>
req_throttle(rate = 10/60)
if (length(query) > 0)
req <- do.call(req_url_query, c(list(req), query))
if (!is.null(body))
req <- req |> req_body_json(body)
req |> req_perform() |> resp_check_status()
}
cat('Template: auth + retry + throttle + error check')एआई शिक्षक के साथ R सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 43
- पाठ
- 159
अक्सर पूछे जाने वाले प्रश्न
क्या “R में REST API का प्रयोग” पाठ निःशुल्क है?
हाँ — R Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “R में REST API का प्रयोग” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“R में REST API का प्रयोग” में मैं क्या सीखूँगा?
API कुंजियों से प्रमाणीकरण करें, परिणामों को पृष्ठों में बाँटकर प्राप्त करें और API प्रतिक्रियाएँ संग्रहीत करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ R Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या R Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर R Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“R में REST API का प्रयोग” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस R Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर R Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- jsonlite से JSON का पार्सिंग
- httr2 से HTTP अनुरोध करना
- R में REST API का प्रयोग
- नेस्टेड JSON संरचनाएँ सँभालना