에이전트 개발자를 위한 REST API 기초
HTTP 메서드, 상태 코드, 헤더, JSON 요청 및 응답 형식을 알아봅니다.
에이전트 개발자를 위한 REST API 기초은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
HTTP 요청이란 무엇입니까
외부 서비스에 연결하는 모든 에이전트는 웹의 언어인 HTTP를 사용합니다. HTTP 요청에는 세 가지 핵심 요소인 method, URL, 그리고 선택 사항인 headers와 body가 있습니다.
method는 서버에 원하는 작업을 알려 주는 동사이고, URL은 리소스의 주소라고 생각하면 됩니다.
import requests
# A simple GET request to a public API
response = requests.get('https://api.example.com/users')
print(response.status_code) # 200
print(response.text) # raw JSON stringGET — 데이터 가져오기
GET은 서버에서 데이터를 가져옵니다. 어떤 것도 수정해서는 안 됩니다. 에이전트는 GET을 사용해 사용자 프로필을 읽고, 작업 목록을 가져오거나, 구성 데이터를 불러옵니다.
params 인수를 사용하면 query string으로 URL에 매개변수를 전달할 수 있습니다.
import requests
# Fetch users filtered by role
params = {'role': 'admin', 'page': 1, 'limit': 10}
response = requests.get(
'https://api.example.com/users',
params=params
)
# URL becomes: /users?role=admin&page=1&limit=10
data = response.json()
print(data['users'])POST — 리소스 생성
POST는 새 리소스를 생성하기 위해 서버로 데이터를 보냅니다. 에이전트는 POST를 사용해 작업을 제출하고, 메시지를 보내거나, 작업을 실행합니다. 데이터는 JSON 형식의 request body에 들어갑니다.
항상 Content-Type: application/json 헤더를 설정하십시오. 대부분의 API에서 이 헤더를 요구합니다.
import requests
import json
payload = {
'title': 'Research competitors',
'assignee': 'agent-001',
'priority': 'high'
}
response = requests.post(
'https://api.example.com/tasks',
json=payload # sets Content-Type automatically
)
print(response.status_code) # 201 Created
new_task = response.json()
print('Created task ID:', new_task['id'])PUT 및 PATCH — 데이터 업데이트
PUT은 전체 리소스를 새 데이터로 교체합니다. PATCH는 특정 필드만 업데이트합니다. 에이전트가 업데이트된 전체 객체를 가지고 있을 때는 PUT을 사용하고, 작업 상태 업데이트와 같은 부분적인 변경에는 PATCH를 사용합니다.
import requests
task_id = '42'
# PATCH: only update the status field
response = requests.patch(
f'https://api.example.com/tasks/{task_id}',
json={'status': 'completed'}
)
print(response.status_code) # 200
# PUT: replace the whole task object
full_task = {
'title': 'Research competitors',
'assignee': 'agent-001',
'priority': 'low',
'status': 'completed'
}
response = requests.put(
f'https://api.example.com/tasks/{task_id}',
json=full_task
)
print(response.status_code) # 200DELETE — 리소스 제거
DELETE는 서버에서 리소스를 제거합니다. 에이전트는 DELETE를 사용해 임시 데이터를 정리하고, 처리된 작업을 제거하거나, 예약된 작업을 취소합니다. 대부분의 DELETE 요청에는 본문이 없습니다.
성공한 delete는 일반적으로 204 No Content를 반환합니다. 응답에 본문이 없다는 뜻입니다.
import requests
task_id = '42'
response = requests.delete(
f'https://api.example.com/tasks/{task_id}'
)
if response.status_code == 204:
print('Task deleted successfully')
elif response.status_code == 404:
print('Task not found — already deleted?')
else:
print('Unexpected status:', response.status_code)상태 코드: 2xx 성공
상태 코드는 요청이 성공했는지 실패했는지 에이전트에 알려 줍니다. 2xx 범위는 성공을 의미합니다.
200 OK— GET/PUT/PATCH가 데이터를 반환했습니다201 Created— POST가 새 리소스를 생성했습니다204 No Content— DELETE가 성공했고 본문이 반환되지 않았습니다
응답 본문을 처리하기 전에 항상 상태 코드를 확인하십시오.
import requests
response = requests.post(
'https://api.example.com/tasks',
json={'title': 'New task'}
)
if response.status_code == 201:
task = response.json()
print('Created:', task['id'])
elif response.status_code == 200:
print('Updated existing resource')
else:
print('Unexpected code:', response.status_code)상태 코드: 4xx 클라이언트 오류
4xx 오류는 에이전트가 잘못된 요청을 보냈다는 의미입니다. 일반적인 오류는 다음과 같습니다.
400 Bad Request— JSON이 유효하지 않거나 필수 필드가 없습니다401 Unauthorized— API 키가 없거나 유효하지 않습니다404 Not Found— 리소스가 존재하지 않습니다429 Too Many Requests— 요청 한도를 초과했습니다
이 경우에는 무작정 다시 시도하지 말고 에이전트가 요청을 수정해야 합니다.
import requests
response = requests.get(
'https://api.example.com/tasks/9999',
headers={'Authorization': 'Bearer YOUR_KEY'}
)
if response.status_code == 401:
print('AUTH ERROR: Check your API key')
elif response.status_code == 404:
print('Task not found')
elif response.status_code == 429:
retry_after = response.headers.get('Retry-After', 60)
print(f'Rate limited. Wait {retry_after}s')
elif response.status_code == 400:
print('Bad request:', response.json().get('error'))상태 코드: 5xx 서버 오류
5xx 오류는 서버 측에서 문제가 발생했다는 의미이며, 에이전트는 잘못한 것이 없습니다. 일반적인 오류는 다음과 같습니다.
500 Internal Server Error— 서버 버그 또는 충돌502 Bad Gateway— 상위 서비스 오류503 Service Unavailable— 서버에 과부하가 걸렸거나 작동하지 않습니다
이러한 오류는 잠시 기다린 후 안전하게 다시 시도할 수 있습니다.
import requests
import time
def get_with_retry(url, headers, max_retries=3):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code < 500:
return response # success or client error
wait = 2 ** attempt
print(f'Server error {response.status_code}, retrying in {wait}s...')
time.sleep(wait)
return response # return last response after retries요청 헤더
Headers는 모든 요청에 메타데이터를 포함합니다. 에이전트에 가장 중요한 헤더는 다음과 같습니다.
Content-Type: application/json— 본문이 JSON임을 서버에 알립니다Authorization: Bearer TOKEN— 요청을 인증합니다Accept: application/json— JSON을 응답으로 받기를 원한다고 서버에 알립니다User-Agent— 클라이언트를 식별합니다(일부 API에서 요구합니다)
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer sk-proj-abc123xyz',
'Accept': 'application/json',
'User-Agent': 'MyAgent/1.0'
}
response = requests.post(
'https://api.example.com/analyze',
headers=headers,
json={'text': 'Analyze this document'}
)
print(response.json())JSON 요청 및 응답 본문
대부분의 최신 API는 JSON 형식으로 데이터를 주고받습니다. 데이터를 보낼 때는 요청에서 json=payload를 사용하십시오. 그러면 자동으로 직렬화되고 헤더가 설정됩니다. 데이터를 받을 때는 response.json()을 호출하여 본문을 Python 딕셔너리로 구문 분석합니다.
접근하기 전에 항상 예상한 키가 존재하는지 확인하십시오.
import requests
# Send JSON body
response = requests.post(
'https://api.example.com/summarize',
json={
'content': 'Long article text here...',
'max_length': 150,
'format': 'bullet_points'
}
)
# Parse JSON response
result = response.json()
# Always check keys exist
summary = result.get('summary', 'No summary returned')
tokens_used = result.get('usage', {}).get('total_tokens', 0)
print('Summary:', summary)
print('Tokens used:', tokens_used)모든 내용 통합하기
잘 작성된 에이전트는 method 선택, 적절한 헤더, 상태 코드 확인, JSON 구문 분석을 하나의 깔끔한 도우미 함수로 묶어 API 호출을 처리합니다. 이렇게 하면 모든 API 상호 작용이 일관되고 디버깅하기 쉬워집니다.
Session 객체를 사용하면 여러 요청에서 연결을 재사용하고 헤더를 공유할 수 있습니다.
import requests
class APIClient:
def __init__(self, base_url, api_key):
self.base_url = base_url
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json',
'Accept': 'application/json'
})
def get(self, path, params=None):
r = self.session.get(f'{self.base_url}{path}', params=params)
r.raise_for_status()
return r.json()
def post(self, path, payload):
r = self.session.post(f'{self.base_url}{path}', json=payload)
r.raise_for_status()
return r.json()
# Usage
client = APIClient('https://api.example.com', 'sk-proj-abc123')
tasks = client.get('/tasks', params={'status': 'open'})
new_task = client.post('/tasks', {'title': 'Write report'})빠른 확인: HTTP method
HTTP method와 상태 코드에 대한 이해도를 확인하십시오.
HTTP 기초 복습
이제 모든 에이전트가 의존하는 HTTP의 기초를 알게 되었습니다.
- GET은 가져오고, POST는 생성하며, PUT/PATCH는 업데이트하고, DELETE는 제거합니다
- 2xx = 성공, 4xx = 에이전트의 오류, 5xx = 서버의 오류
- 헤더는 인증(
Authorization: Bearer)과 형식(Content-Type: application/json)을 전달합니다 response.json()으로 본문을 구문 분석하고.get()으로 필드에 안전하게 접근합니다Session객체는 여러 요청에서 헤더와 연결을 공유합니다
이러한 기초를 확실히 익히면 어떤 REST API에도 자신 있게 에이전트를 연결할 수 있습니다.
자주 묻는 질문
“에이전트 개발자를 위한 REST API 기초” 강의는 무료인가요?
네 — “에이전트 개발자를 위한 REST API 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
“에이전트 개발자를 위한 REST API 기초”에서 뭘 배우나요?
HTTP 메서드, 상태 코드, 헤더, JSON 요청 및 응답 형식을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Agents을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“에이전트 개발자를 위한 REST API 기초” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 에이전트 개발자를 위한 REST API 기초
- 인증: API 키와 OAuth
- API 응답 및 오류 처리
- 요청 제한 및 재시도 로직