API (ממשק תכנות יישומים) מאפשר לתוכנות שונות לתקשר ביניהן.
באמצעות HTTP requests, אנו יכולים לשלוח בקשות לשרתים ולקבל נתונים בתגובה, לרוב בפורמט JSON.
מה נלמד:
- שליחת בקשות HTTP (Sending HTTP requests):
שימוש בספרייתrequests
כדי לשלוח בקשותGET
ו-POST
. - פענוח תגובות JSON (Parsing JSON responses):
שימוש במודולjson
או תכונות שלrequests
כדי לנתח תגובות מהשרת.
דוגמת קוד
import requests
# Sending an HTTP GET request
url = "https://api.coindesk.com/v1/bpi/currentprice.json"
response = requests.get(url)
if response.status_code == 200: # Check if the request was successful
data = response.json() # Parse the JSON response
# Accessing specific data in the JSON
bitcoin_price = data["bpi"]["USD"]["rate"]
print(f"Current Bitcoin price in USD: {bitcoin_price}")
else:
print(f"Failed to fetch data. Status code: {response.status_code}")
הסבר על הקוד
- שליחת בקשת HTTP:
requests.get(url)
: שולח בקשתGET
ל-URL הנתון.response.status_code
: בודק אם הבקשה הצליחה (סטטוס קוד 200 פירושו הצלחה).
- פענוח JSON:
response.json()
: ממיר את התגובה ממחרוזת JSON למבנה נתונים של פייתון (מילון, רשימה וכו').data["bpi"]["USD"]["rate"]
: גישה לערך מסוים במבנה ה-JSON.
תרגילים
תרגיל 1:
שלחו בקשת GET
ל-https://api.agify.io?name=YOUR_NAME
ונתחו את התגובה כדי להציג את הגיל המשוער לשם שהוזן.
תרגיל 2:
צרו תוכנית שמבצעת בקשה ל-https://api.coindesk.com/v1/bpi/currentprice.json
ומדפיסה את מחיר הביטקוין ביורו.
תרגיל 3:
שלחו בקשת GET
ל-https://jsonplaceholder.typicode.com/posts
ונתחו את התגובה כדי להדפיס את הכותרת של הפוסט הראשון.
תרגיל 4:
שלחו בקשת POST
ל-https://jsonplaceholder.typicode.com/posts
עם נתונים דמויים (כותרת, גוף, משתמש) והדפיסו את התגובה.
תרגיל 5:
אתגר: כתבו תוכנית שמבצעת בקשה ל-API של מזג אוויר ומדפיסה את הטמפרטורה בעיר שהמשתמש מזין.
הפרויקט הגדול: משחק הטריוויה
נשתמש ב-API כדי לקבל שאלות טריוויה דינמיות ממקור חיצוני.
קובץ question.py
import requests
class Question:
"""A class to represent a quiz question."""
def __init__(self, text, answer):
self.text = text
self.answer = answer
def is_correct(self, user_answer):
"""Check if the user's answer is correct."""
return str(user_answer).lower() == str(self.answer).lower()
@staticmethod
def fetch_questions(api_url):
"""Fetch trivia questions from an external API."""
try:
response = requests.get(api_url)
if response.status_code == 200:
data = response.json()
questions = []
for item in data["results"]:
text = item["question"]
answer = item["correct_answer"]
questions.append(Question(text, answer))
return questions
else:
print(f"Failed to fetch questions. Status code: {response.status_code}")
return []
except Exception as e:
print(f"An error occurred while fetching questions: {e}")
return []
קובץ quiz_game.py
from question import Question
from player import Player
class QuizGame:
"""A class to manage the quiz game."""
def __init__(self, questions):
self.questions = questions # List of Question objects
def start(self, player_name):
"""Start the game for a player."""
player = Player(player_name)
for question in self.questions:
print("\n" + question.text)
user_answer = input("Your answer: ").strip()
if question.is_correct(user_answer):
print("Correct!")
player.add_score(1)
else:
print(f"Wrong! The correct answer was: {question.answer}")
print(f"\n{player.name}, your final score is: {player.score}")
קובץ main.py
from question import Question
from quiz_game import QuizGame
API_URL = "https://opentdb.com/api.php?amount=5&type=multiple"
def main():
"""Main function to run the quiz game."""
print("Fetching trivia questions...")
questions = Question.fetch_questions(API_URL)
if not questions:
print("No questions available to play.")
return
name = input("Enter your name: ").strip()
quiz = QuizGame(questions)
quiz.start(name)
if __name__ == "__main__":
main()
שיפורים שנוספו לפרויקט:
- מחלקה
Question
:- שיטה סטטית
fetch_questions
שמבצעת בקשה ל-API חיצוני לקבלת שאלות.
- שיטה סטטית
- API חיצוני:
- בקשה ל-
https://opentdb.com/api.php
לקבלת שאלות דינמיות לפעילות המשחק.
- בקשה ל-
- פרויקט דינמי ומעודכן:
- השאלות במשחק מתעדכנות בזמן אמת ממקור חיצוני.