2012-03-02 9 views
14

Sto tentando di utilizzare urllib2.urlopen per eseguire richieste GET e POST tramite l'API di Facebook Graph. Ho notato da qui: https://stackoverflow.com/questions/2690723/facebook-graph-api-and-django che posso eseguire la richiesta GET abbastanza facilmente.Come utilizzare urllib2.urlopen per effettuare la richiesta POST senza argomento dati

E da qui: How to send a POST request using django? e i documenti Python http://docs.python.org/library/urllib2.html sembra che sia necessario il param dei dati per eseguire una richiesta POST.

Ma guardando API di Facebook: http://developers.facebook.com/docs/reference/api/event/#invited si dice

È possibile invitare gli utenti a un evento con l'emissione di un HTTP POST per /EVENT_ID/invitato/USER_ID

Non sono sicuro come potrei farlo con urlopen, poiché l'apertura di questo url direttamente controllerà solo se l'utente è stato invitato, come indicato nella pagina API:

È possibile controllare se un utente specifico è stato invitato a un evento l'emissione di un HTTP GET a/EVENT_ID/invitato/USER_ID:

apprezzare l'ingresso.

risposta

0

Credo che tu abbia più o meno risposto alla tua domanda, sei solo troppo pensando che ...

  • Per invitare un problema all'utente un post con urlopen

  • Per controllare se un utente è stato invitato, emettere un GET con urlopen.

In entrambi i casi, si sta comunicando con lo stesso URL, la differenza è GET o POST.

Se non siete sicuri della differenza tra un GET e POST con un urlopen, leggere questo documento:

http://www.doughellmann.com/PyMOTW/urllib2/

+0

Grazie per la risposta, sono consapevole della differenza. Ma dal momento che urlopen invia una richiesta POST solo quando viene fornito il parametro data, non sapevo cosa fare se non avevo alcun parametro (http://developers.facebook.com/docs/reference/api/ ha qualche casi con azioni POST senza argomenti) – airfang

+0

quindi per GET non utilizzare i dati, basta fornire i parametri nell'URL. –

34

Sembra che si desidera inviare una richiesta POST vuoto, anche se urllib2.urlopen() invia un messaggio solo quando si specifica il parametro data.

Sembra che in realtà invia un post vuota se si imposta data = "", e ottenere la richiesta solo quando i dati = None:

urllib2.urlopen("http://127.0.0.1:8000", data="") 
"POST/HTTP/1.1" 501 - 

urllib2.urlopen("http://127.0.0.1:8000", data=None) 
"GET/HTTP/1.1" 200 - 

Speranza che aiuta. Ho ottenuto le stampe di risposta dal piccolo server HTTP di cui hanno un esempio: http://docs.python.org/library/simplehttpserver.html

+0

Esattamente quello che stavo cercando! Grazie mille! – airfang

2

Un altro modo per inviare un POST vuoto è creare una richiesta e sovrascrivere il suo metodo get_method. Questo è più lavoro in questo caso, ma potrebbe essere più pulito in altri casi (se hai già una Richiesta, per esempio).

request = urllib2.Request(url) 
    request.get_method = lambda: 'POST' 
    urllib2.urlopen(request) 

get_method è un metodo che restituisce il metodo da utilizzare, ecco noi sovrascrivere con una funzione lambda che restituisce 'post'.

2

Direttamente dal Python (urllib2) Documentazione

urllib2.urlopen (url [, dati] [, timeout]) aprire l'URL URL, che può essere sia una stringa o un oggetto di richiesta. Avviso Le richieste HTTPS non eseguono alcuna verifica del certificato del server. i dati possono essere una stringa che specifica i dati aggiuntivi da inviare al server, oppure Nessuna se non sono necessari tali dati. Attualmente le richieste HTTP sono le uniche che usano i dati; la richiesta HTTP sarà un POST anziché un GET quando viene fornito il parametro dei dati.

Problemi correlati