R'de REST API'lerini Kullanma
API anahtarlarıyla kimlik doğrulaması yapın, sonuçları sayfalara bölerek alın ve API yanıtlarını depolayın.
R'de REST API'lerini Kullanma, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.
REST API Kavramları
REST API'leri, kaynak URL'leri üzerinde HTTP yöntemlerini (GET, POST, PUT, DELETE) kullanır. Yanıtlar genellikle JSON biçimindedir. API'ler kimlik doğrulaması gerektirebilir, sayfalandırmayı destekleyebilir ve istek hızını sınırlayabilir. İyi bir R API istemcisi bu üç durumu da ele alır.
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 Belirteciyle Kimlik Doğrulama
Modern API'lerin çoğu Bearer belirteçlerini (OAuth 2.0) kullanır. Belirteci Sys.setenv() ile bir ortam değişkeninde veya bir .Renviron dosyasında saklayın. Belirteçleri betiklerde asla doğrudan yazmayın.
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')Yeniden Kullanılabilir API İstemcisi Oluşturma
Temel URL'yi, kimlik doğrulamasını ve hata işlemeyi bir oluşturucu işlevinde kapsülleyin. Her API uç noktası, bu temel işlevi çağıran bir yöntem haline gelir — bu, R API paketleri için standart örüntüdür.
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() ile Sayfalandırma
Birçok API, sayfalandırma için Link üst bilgilerini kullanır (RFC 5988): yanıt, Link: <url>; rel="next" üst bilgisini içerir. resp_link_url(resp, 'next'), sonraki sayfanın URL'sini otomatik olarak çıkarır.
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')İmleç Tabanlı Sayfalandırma
Bazı API'ler (Twitter, Slack) sayfa numaraları yerine imleçler kullanır. Yanıt, next_cursor veya next_page_token alanını içerir. Sonraki istek için bunu bir sorgu parametresi olarak iletin.
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')Hataları Uygun Şekilde İşleme
Üretim API istemcisi, HTTP hatalarını ve ağ arızalarını ayrı ayrı yakalar. req_perform() çevresinde tryCatch() kullanın ve duruma özgü işlemeyi gerçekleştirmek için httr2_http_* hata koşulunu inceleyin.
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 Yanıtlarını Önbelleğe Alma
Geliştirme sırasında gereksiz isteklerden kaçınmak için API yanıtlarını önbelleğe alın. httr2 içindeki req_cache(), Cache-Control üst bilgilerine uyarak yanıtları diskte önbelleğe alır. Elle önbelleğe alma her API için kullanılabilir.
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() ile Paralel İstekler
req_perform_parallel(), birden fazla isteği eşzamanlı göndererek toplu işlemlerin toplam süresini büyük ölçüde azaltır. Paralel yürütme sırasında istek hızı sınırlarına uymak için bunu req_throttle() ile birleştirin.
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')İstek Hızı Sınırlarıyla Çalışma
API'ler, istek hızı sınırının durumunu yanıt üst bilgileriyle bildirir: X-RateLimit-Remaining, X-RateLimit-Reset ve Retry-After. Akıllı geri çekilme uygulamak için bunları okuyun.
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')Eksiksiz API İstemcisi: GitHub Örneği
Tüm parçaları bir araya getirelim: kimlik doğrulaması yapan, sayfalandırılmış depo listelerini alan ve hataları işleyen eksiksiz bir GitHub API istemcisi — şimdiye kadar öğrenilen tüm örüntüleri gösterir.
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 İstemci Kimlik Bilgileri
Bazı API'ler OAuth 2.0 istemci kimlik bilgileri akışını gerektirir: bir erişim belirteci almak için client_id + client_secret değerlerini değiş tokuş edin. httr2'nin oauth_client() ve req_oauth_client_credentials() işlevleri bunu otomatik olarak gerçekleştirir.
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')Hızlı Kontrol
httr2 ile R'de REST API istemcileri oluşturma konusundaki anlayışınızı sınayın.
Özet: REST API'lerini Kullanma
Temel çıkarımlar: Temel URL'yi, kimlik doğrulamayı ve yeniden denemeyi bir oluşturucuda kapsülleyerek yeniden kullanılabilir istemciler oluşturun. Kimlik doğrulaması için req_auth_bearer_token() kullanın — belirteçleri ortam değişkenlerinde saklayın. resp_link_url() ile Link üst bilgileri veya imleç tabanlı örüntüler aracılığıyla sayfalandırmayı ele alın. HTTP hatalarını her zaman resp_check_status() ve tryCatch() ile işleyin. Toplu çağrılar için req_perform_parallel() kullanın. Geliştirme sırasında sonuçları önbelleğe alın.
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')Sıkça Sorulan Sorular
“R'de REST API'lerini Kullanma” dersi ücretsiz mi?
Evet — “R'de REST API'lerini Kullanma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.
“R'de REST API'lerini Kullanma” dersinde ne öğreneceğim?
API anahtarlarıyla kimlik doğrulaması yapın, sonuçları sayfalara bölerek alın ve API yanıtlarını depolayın. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
R Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“R'de REST API'lerini Kullanma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu R Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- jsonlite ile JSON Ayrıştırma
- httr2 ile HTTP İstekleri Gönderme
- R'de REST API'lerini Kullanma
- İç İçe JSON Yapılarını İşleme