🌐 کار با APIها با کتابخانه requests
کتابخانه requests یکی از محبوبترین و سادهترین کتابخانههای پایتون برای ارسال درخواستهای HTTP و کار با APIها است. با استفاده از این کتابخانه میتوانید به راحتی دادهها را از وبسرویسها دریافت کنید، به سرورها داده ارسال کنید و با APIهای مختلف کار کنید.
🔹 نصب و import
# نصب (در محیط واقعی)
# pip install requests
# import کردن
import requests
# بررسی نسخه
print(requests.__version__)
🔹 GET درخواست ساده
import requests
# ارسال درخواست GET
response = requests.get("https://api.github.com/events")
# بررسی وضعیت
print(f"Status Code: {response.status_code}") # 200 = OK
# محتوای پاسخ
print(f"Response type: {type(response.json())}") # list
# نمایش اولین رویداد
events = response.json()
print(f"First event: {events[0]['type']}")
🔹 GET با پارامترها
import requests
# پارامترهای جستجو
params = {
"q": "python",
"sort": "stars",
"order": "desc",
"per_page": 5
}
# ارسال درخواست با پارامترها
response = requests.get("https://api.github.com/search/repositories", params=params)
# مشاهده URL نهایی
print(f"Final URL: {response.url}")
print(f"Status: {response.status_code}")
# نمایش نتایج
data = response.json()
print(f"Total repositories: {data['total_count']}")
for repo in data['items'][:3]:
print(f" {repo['name']} - {repo['stargazers_count']} stars")
🔹 POST درخواست
import requests
# دادههای ارسالی
data = {
"title": "My New Post",
"body": "This is the content of my post.",
"userId": 1
}
# ارسال درخواست POST با json
response = requests.post(
"https://jsonplaceholder.typicode.com/posts",
json=data
)
print(f"Status: {response.status_code}") # 201 Created
print("Response:")
print(response.json())
🔹 Headerها و User-Agent
import requests
# تنظیم headerها
headers = {
"User-Agent": "MyPythonApp/1.0",
"Accept": "application/json"
}
response = requests.get(
"https://api.github.com/users/octocat",
headers=headers
)
print(f"Status: {response.status_code}")
print(f"User Agent sent: {response.request.headers['User-Agent']}")
# نمایش اطلاعات کاربر
user = response.json()
print(f"Name: {user.get('name')}")
print(f"Public repos: {user.get('public_repos')}")
🔹 مدیریت خطاها
import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout
url = "https://api.github.com/user"
try:
# درخواست با timeout
response = requests.get(url, timeout=(5, 10))
# بررسی status code
response.raise_for_status() # اگر status > 400 باشد، خطا میدهد
data = response.json()
print("Request successful!")
print(data)
except Timeout:
print("⏰ Request timed out!")
except ConnectionError:
print("🔌 Connection error!")
except HTTPError as e:
print(f"❌ HTTP error: {e}")
print(f"Status code: {response.status_code}")
except RequestException as e:
print(f"⚠️ Request error: {e}")
🔹 PUT و DELETE درخواستها
import requests
# PUT: بهروزرسانی کامل
updated_data = {
"id": 1,
"title": "Updated Title",
"body": "Updated content.",
"userId": 1
}
response = requests.put(
"https://jsonplaceholder.typicode.com/posts/1",
json=updated_data
)
print(f"PUT Status: {response.status_code}")
print("PUT Response:", response.json())
# DELETE: حذف
response = requests.delete("https://jsonplaceholder.typicode.com/posts/1")
print(f"DELETE Status: {response.status_code}") # 200 OK
print(f"DELETE Response: {response.text}")
🔹 Session (نشست) برای حفظ اطلاعات
import requests
# ایجاد نشست
session = requests.Session()
# تنظیم header عمومی برای همه درخواستها
session.headers.update({
"User-Agent": "MyApp/1.0",
"Accept": "application/json"
})
# ارسال درخواست با نشست
response1 = session.get("https://api.github.com/users/octocat")
response2 = session.get("https://api.github.com/users/defunkt")
print(f"User 1: {response1.json()['login']}")
print(f"User 2: {response2.json()['login']}")
# بستن نشست
session.close()
🔹 Authentication (احراز هویت)
import requests
from requests.auth import AuthBase
# روش ۱: Basic Authentication
response = requests.get(
"https://api.github.com/user",
auth=("username", "password") # واقعاً از توکن استفاده کنید
)
print(f"Basic Auth Status: {response.status_code}")
# روش ۲: Token Authentication (سفارشی)
class TokenAuth(AuthBase):
def __init__(self, token):
self.token = token
def __call__(self, request):
request.headers["Authorization"] = f"Bearer {self.token}"
return request
# استفاده از TokenAuth
# token = "your_github_token_here"
# response = requests.get(
# "https://api.github.com/user",
# auth=TokenAuth(token)
# )
# print(f"Token Auth Status: {response.status_code}")
print("Note: Replace with actual token for real authentication.")
🔹 دانلود فایل با requests
import requests
# دانلود تصویر
url = "https://via.placeholder.com/150"
response = requests.get(url, stream=True)
if response.status_code == 200:
# ذخیره در فایل
with open("image.png", "wb") as file:
for chunk in response.iter_content(chunk_size=128):
file.write(chunk)
print("✅ Image downloaded successfully!")
else:
print(f"❌ Failed to download: {response.status_code}")
🔹 Timeout و Retry
import requests
from requests.adapters import HTTPAdapter
from requests.exceptions import RetryError
# ایجاد نشست با retry
session = requests.Session()
# تنظیم retry
retries = HTTPAdapter(max_retries=3)
session.mount("http://", retries)
session.mount("https://", retries)
try:
# timeout: (connect_timeout, read_timeout)
response = session.get(
"https://httpbin.org/delay/2",
timeout=(2, 5) # 2 ثانیه برای اتصال، 5 ثانیه برای خواندن
)
print(f"Status: {response.status_code}")
except requests.exceptions.Timeout:
print("⏰ Request timed out!")
except RetryError:
print("❌ Retry limit exceeded!")
finally:
session.close()
🔹 مثال جامع: کلاینت GitHub API
import requests
class GitHubClient:
"""کلاینت ساده برای GitHub API"""
def __init__(self, token=None):
self.base_url = "https://api.github.com"
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "MyGitHubApp/1.0",
"Accept": "application/vnd.github.v3+json"
})
if token:
self.session.headers.update({
"Authorization": f"token {token}"
})
def get_user(self, username):
"""دریافت اطلاعات یک کاربر"""
response = self.session.get(f"{self.base_url}/users/{username}")
response.raise_for_status()
return response.json()
def get_repos(self, username):
"""دریافت مخازن یک کاربر"""
response = self.session.get(f"{self.base_url}/users/{username}/repos")
response.raise_for_status()
return response.json()
def search_repos(self, query, limit=5):
"""جستجوی مخازن"""
params = {"q": query, "per_page": limit, "sort": "stars"}
response = self.session.get(f"{self.base_url}/search/repositories", params=params)
response.raise_for_status()
return response.json()["items"]
def close(self):
"""بستن نشست"""
self.session.close()
# استفاده
client = GitHubClient()
try:
# دریافت اطلاعات کاربر
user = client.get_user("octocat")
print(f"User: {user['login']}")
print(f"Name: {user.get('name')}")
print(f"Public repos: {user['public_repos']}")
# جستجوی مخازن
repos = client.search_repos("python", limit=3)
print("\nPopular Python repositories:")
for repo in repos:
print(f" {repo['name']} - {repo['stargazers_count']} stars")
finally:
client.close()
📌 نکات کلیدی
- ✅
requests.get()برای دریافت داده از API. - ✅
requests.post()برای ارسال و ایجاد داده جدید. - ✅
requests.put()برای بهروزرسانی کامل داده. - ✅
requests.delete()برای حذف داده. - ✅ با پارامتر
paramsمیتوانید پارامترهای URL را ارسال کنید. - ✅ با پارامتر
jsonیاdataمیتوانید بدنه درخواست را ارسال کنید. - ✅
response.json()پاسخ را به دیکشنری تبدیل میکند. - ✅
response.raise_for_status()برای مدیریت خطا. - ✅
Sessionبرای حفظ اطلاعات بین درخواستها. - ✅ همیشه timeout را برای جلوگیری از قفل شدن برنامه تنظیم کنید.