Reputation: 3
I'm trying to get some data from a third-party API, and I always get the same result no matter how I do it.
This is my code:
row = db.execute("SELECT isbn, title, author, year FROM books WHERE \
isbn = :isbn",
{"isbn": isbn})
bookInfo = row.fetchall()
""" GOODREADS reviews """
# Read API key from env variable
key = os.getenv('GOODREADS_KEY')
# Query the api with key and ISBN as parameters
query = requests.get("https://www.goodreads.com/book/review_counts.json",
params={"key": key, "isbns": isbn})
# Convert the response to JSON
response = query.json()
# "Clean" the JSON before passing it to the bookInfo list
response = response['books'][0]
# Append it as the second element on the list. [1]
bookInfo.append(response)
""" Users reviews """
# Search book_id by ISBN
row = db.execute("SELECT id FROM books WHERE isbn = :isbn",
{"isbn": isbn})
# Save id into variable
book = row.fetchone() # (id,)
book = book[0]
# Fetch book reviews
results = db.execute("SELECT users.username, review, rate, \
to_char(date, 'DD Mon YY - HH24:MI:SS') as time \
FROM users \
INNER JOIN reviews \
ON users.id = reviews.user_id \
WHERE book_id = :book \
ORDER BY time",
{"book": book})
if results.rowcount == 0:
return render_template("error.html", message="kept you waiting, huh")
reviews = results.fetchall()
return render_template("book.html", bookInfo=bookInfo, reviews=reviews)
And this is the error:
Traceback (most recent call last):
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\Enrique Mota\Documents\project1\LR.py", line 9, in decorated_function
return f(*args, **kwargs)
File "C:\Users\Enrique Mota\Documents\project1\application.py", line 195, in book
response = query.json()
File "c:\users\enrique mota\documents\project1\env\lib\site-packages\requests\models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Users\Enrique Mota\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:\Users\Enrique Mota\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\Enrique Mota\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
These are the parameters to get the book info:
Get review statistics given a list of ISBNs Get review statistics for books given a list of ISBNs. ISBNs can be specified as an array (e.g. isbns[]=0441172717&isbns[]=0141439602) or a single, comma-separated string (e.g. isbns=0441172717,0141439602). You can mix ISBN10s and ISBN13s, but you'll receive a 422 error if you don't specify any, and you'll receive a 404 if none are found. URL: https://www.goodreads.com/book/review_counts.json (sample url) HTTP method: GET Parameters:
key: Developer key (required).
isbns: Array of ISBNs or a comma separated string of ISBNs (1000 ISBNs per request max.)
format: json
callback: function to wrap JSON response
This is a sample URL:
https://www.goodreads.com/book/review_counts.json?isbns=0441172717%2C0141439602&key=IcOZSbhCZizWqiomGMUw
To my understanding, I only need two parameters which I specified in my code, no matter how I code the app, It always has that response/error, what I'm I doing wrong?
I did import json, os, jsonify, and requests btw.
Upvotes: 0
Views: 492
Reputation: 23815
The code below works so you need to check the params you send (key and isbns)
import requests
r = requests.get("https://www.goodreads.com/book/review_counts.json",
params={"key": 'IcOZSbhCZizWqiomGMUw', "isbns": '0441172717,0141439602'})
if r.status_code == 200:
print(r.json())
output
{'books': [{'id': 47173379, 'isbn': '0441172717', 'isbn13': '9780441172719', 'ratings_count': 85, 'reviews_count': 211, 'text_reviews_count': 5, 'work_ratings_count': 641157, 'work_reviews_count': 1080654, 'work_text_reviews_count': 17613, 'average_rating': '4.22'}, {'id': 1953, 'isbn': '0141439602', 'isbn13': '9780141439600', 'ratings_count': 705737, 'reviews_count': 1237587, 'text_reviews_count': 11902, 'work_ratings_count': 758306, 'work_reviews_count': 1389929, 'work_text_reviews_count': 15806, 'average_rating': '3.83'}]}
Upvotes: 1
Reputation: 755
You should check status code first.
if query.status_code == requests.codes['ok']:
response = query.json()
else:
# Do something else
Upvotes: 1