PDA

Visualizza la versione completa : [python] Problema httprequest


fermat
21-02-2013, 10:09
ciao!
sto cercando di richiamare un file in remoto che mi da un risultato in formato JSON:


import httplib

class Service(object):

conn = None

def __init__(self):
self.conn = httplib.HTTPConnection("www.sito.it/service")

def readRes(self):
self.conn.request(method = 'GET', url = '/file.php', headers = { 'Content-Type': 'application/json' })
res = self.conn.getresponse()
print res.status, res.reason

if __name__ == "__main__":
s = Service()
s.readRes()

il file è raggiungibile tramite browser.
solo che in fase di esecuzione mi viene dato questo errore:


for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno 11004] getaddrinfo failed

vi ho riportato solo l'ultimo pezzo.
secondo voi da cosa dipende?

fermat
21-02-2013, 12:47
ok ho trovato l'errore:


import httplib

class Service(object):

conn = None

def __init__(self):
self.conn = httplib.HTTPConnection("www.sito.it")

def readRes(self):
self.conn.request(method = 'GET', url = '/service/file.php', headers = { 'Content-Type': 'application/json' })
res = self.conn.getresponse()
print res.status, res.reason

if __name__ == "__main__":
s = Service()
s.readRes()

come url iniziale non vanno messe sottodirectory o altro, ma solo l'url principale.
ciao!

MItaly
21-02-2013, 14:21
Il punto è che il parametro del costruttore di HTTPConnection non è "un pezzo di URL", ma il server al quale deve connettersi. In ogni caso, usando urllib2 e un oggetto Opener puoi lasciare che sia lui a smazzarsi i dettagli di smontare l'URL nelle sue varie componenti e agire di conseguenza.

fermat
21-02-2013, 15:40
si ho visto bene nella doc.
ho provato anche come dici te.

in verità non saprei dirti se megli ouno o l'altro, mi sembrano uguali.
alla fine mi viene sempre restituita una stringa json che devo cmq trasformare!

MItaly
21-02-2013, 15:47
Naturale che ti restituiscano la stessa cosa, semplicemente il secondo metodo in genere è un po' più semplice da usare (gli passi direttamente l'URL senza doverti preoccupare di spezzarlo in protocollo/server/percorso), tutto qui. :ciauz:

Loading