2017-08-27 2 views
0

Ich versuche, eine API-Aufruf an Yelp Fusion API. Meine Anrufe funktionieren, wenn sie hart codiert sind. Ich versuche, eine Liste von Unternehmen zu bekommen und dann eine Liste von Bewertungen für diese Unternehmen, die zwei GETs erfordert. Ich möchte die Liste der Unternehmen durchgehen und die zugehörigen Bewertungen erhalten. Der folgende Code führt zu einer Nachricht Send a complete request to the server bei Verwendung des Variablenformulars. Hartes Kodieren eines Geschäfts-ID-Wertes funktioniert gut. Nicht sicher, was die Herausforderung ist. (Newbie Frage so mein Code ist wahrscheinlich nicht die beste entweder)Verwenden eines Variablen-URL-Werts für Python HTTPConnection.request fehlgeschlagen

import http.client 
import json 

conn = http.client.HTTPSConnection("api.yelp.com") 

headers = { 
'authorization': "Bearer <access token value>", 
'cache-control': "no-cache", 
'postman-token': "<token value>" 
} 
#This request works fine 
conn.request("GET", "/v3/businesses/search?latitude=40.8059518&longitude=-73.9657435&limit=10&radius=200&term=restaurant", headers=headers) 

res = conn.getresponse() 
data = res.read() 

yelp_result = json.loads(data.decode("utf-8")) 

all_businesses = [] 
for business in yelp_result['businesses']: 
    b_name = business['name'] 
    b_id = business['id'] 
    rurl = "/v3/businesses/" + b_id + "/reviews" 
    #This is the request resulting in error given earlier 
    conn.request("GET",rurl,headers=headers) 
    all_businesses.append((b_id, b_name)) 
+0

integrieren Sie testen also eine fest codierte URL gegen eine * völlig andere * variable URL, und Sie sind sich nicht sicher, was falsch ist. Also gehen Sie Schritt für Schritt, vereinfachen Sie Ihren Code, drucken Sie die URLs aus, testen Sie sie in einem Browser, etc. Das ist keine Frage für uns, Sie müssen es nur debuggen. –

+0

Können Sie Beispiele für 'b_id' und' rurl' veröffentlichen? –

+0

Danke @JohnZwinck für die Hinweise und Eingaben. Die Verwendung von Advice konnte feststellen, dass der Aufruf conn.getresponse() nicht ohne die entsprechenden Aufrufe conn.getrispse() und res.read() verwendet werden kann. Nicht ganz sicher warum, aber es funktioniert. Verifiziert durch Kommentieren dieser Zeilen in der Arbeitsversion und Reproduzieren früherer Fehler. (scheint seltsam IMO, aber was auch immer). Sah jemand anderes Hilfe in einer anderen Frage über die Verwendung der Yelp-API mit Python gesucht, so nahm die Lösung ein wenig weiter in der Hoffnung, dass es auch gegen diese Frage gilt. Danke noch einmal. – lmckeogh

Antwort

0

Herausforderung mit dem conn.request Anruf scheint zu sein, dass es auch conn.getresponse() und res.read() Anrufe Bedürfnisse entspricht. Öffnet keine Verbindung, wenn nichts damit getan werden soll. (Würde es lieben, wenn jemand mehr Einsicht dafür hätte). Hier ist, wie ein Anruf zu tätigen, um begrenzte Anzahl von Unternehmen in einem Umkreis von einem Standort zu erhalten (lat/long) und dann auch Kritik Schnipsel als Teil dieser Unternehmen info (nicht zurückgegeben in der neuen Fusion API)

#My version of pulling a Yelp review around a particular business 
#3 step proceedure 
# 1. find all businesses around a location 
# 2. convert to a dictionary with the key = business ID in Yelp 
# 3a. request the reviews for the business ID, iteratively if necessary 
# 3b. add reviews to the appropriate business as a list[0:2] of dict 

import http.client 
import json 
# Step 1. Yelp API call to return list of businesses around a location 
# for example, hard coded lat/long values used in conn.request call below. 
# Future functions: 
# - dynamically create desired location. 
# - number of businesses to return, current limit is 5 for testing 
headers = { 
    'authorization': "Bearer <access token value>", 
    'cache-control': "no-cache", 
    'postman-token': "<token value>" 
} 
conn = http.client.HTTPSConnection("api.yelp.com") 
conn.request("GET", "/v3/businesses/search?latitude=40.8059518&longitude=-73.9657435&limit=5&radius=200&term=restaurant", headers=headers) 
res = conn.getresponse() 
data = res.read() 
yelp_result = json.loads(data.decode("utf-8")) #converts byte data to just text 

# Step 2. convert to a dictionary with keys = business ID values 
# Think the for loop below can be simplified. (Future effort) 
biz2 = {} 
for business in yelp_result['businesses']: 
    b_id = business['id'] 
    biz2[b_id] = business 

# Step 3. Request and adding reviews to appropriate business 
for business in yelp_result['businesses']: 
    b_id = business['id'] 
    r_url = "/v3/businesses/" + b_id + "/reviews" #review request URL creation based on business ID 
    #Step 3a. request the reviews for the business ID 
    conn.request("GET",r_url,headers=headers) 
    rev_res = conn.getresponse()  #response and read functions needed else error(?) 
    rev_data = rev_res.read() 
    yelp_reviews = json.loads(rev_data.decode("utf-8")) 
    #Step 3b. add reviews to the appropriate business 
    biz2[b_id]['reviews'] = yelp_reviews['reviews'] 

print(json.dumps(biz2, indent=3, separators=(',', ': '))) 
Verwandte Themen