generated from mwc/lab_riddles
music on my phone. One feature I like is the personalized playlist recommendations on the home screen. Behind the scenes, my device likely sends an HTTP GET request to Spotify’s servers asking for recommended tracks based on my listening history. The server processes this request, runs algorithms to select songs I might like, and sends back an HTTP response containing the playlist data in JSON format. My app then parses that response and displays the recommended songs for me to play instantly. question 2. Yes, this lab made me realize that every app or website I use is constantly sending and receiving HTTP requests in the background. Even simple actions, like loading a playlist or checking the weather, involve multiple requests and responses I never notice. It makes me appreciate how much coordination happens behind the scenes to make technology feel instant and seamless.
72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
# RiddleAPI
|
|
# ---------
|
|
# By Chris Proctor
|
|
# The Riddle API takes care of connecting to the server.
|
|
|
|
import requests
|
|
from random import choice
|
|
|
|
class APIError(Exception):
|
|
"A custom error we'll use when something goes wrong with the API"
|
|
pass
|
|
|
|
class RiddleAPI:
|
|
"Provides an easy way for Python programs to interact with a Riddle Server"
|
|
|
|
def __init__(self, server_url):
|
|
self.server_url = server_url
|
|
|
|
def get_all_riddles(self):
|
|
"Fetches all the riddles from the server"
|
|
route = "/all"
|
|
response = requests.get(self.server_url + route)
|
|
if response.ok:
|
|
return response.json().get('riddles', [])
|
|
else:
|
|
raise APIError(response.json().get('errors', 'Unknown API error'))
|
|
|
|
def guess_riddle(self, riddle_id, guess):
|
|
"Submits a guess to the server. Returns True or False"
|
|
route = "/guess"
|
|
params = {'id': riddle_id, 'answer': guess}
|
|
response = requests.post(self.server_url + route, json=params)
|
|
if response.ok:
|
|
return response.json()
|
|
else:
|
|
raise APIError(response.json().get('errors', 'Unknown API error'))
|
|
|
|
def get_riddle(self, riddle_id):
|
|
"Fetches a single riddle from the server"
|
|
route = "/show"
|
|
params = {'id': riddle_id}
|
|
response = requests.get(self.server_url + route, params=params)
|
|
|
|
if not response.ok:
|
|
raise APIError(response.json().get('errors', 'Unknown API error'))
|
|
|
|
data = response.json()
|
|
# Handle either 'riddles' list or 'riddle' key
|
|
if 'riddles' in data and len(data['riddles']) > 0:
|
|
return data['riddles'][0]
|
|
elif 'riddle' in data:
|
|
return data['riddle']
|
|
else:
|
|
raise APIError(f"No riddle found with id {riddle_id}")
|
|
|
|
def get_random_riddle(self):
|
|
"Fetches all riddles from the server and then randomly returns one"
|
|
riddles = self.get_all_riddles()
|
|
if riddles:
|
|
return choice(riddles)
|
|
else:
|
|
raise APIError("No riddles available to choose from")
|
|
|
|
def add_riddle(self, question, answer):
|
|
"Adds a new riddle to the server"
|
|
route = "/new"
|
|
params = {'question': question, 'answer': answer}
|
|
response = requests.post(self.server_url + route, json=params)
|
|
if response.ok:
|
|
return response.json() # usually returns the new riddle info
|
|
else:
|
|
raise APIError(response.json().get('errors', 'Unknown API error')) |