2011-10-19 23 views
7

Tengo problemas para entender cómo emitir una solicitud HTTP POST utilizando curl desde dentro de python.Http POST Curl en python

Estoy anclado para publicar en facebook abrir gráfico. Aquí está el ejemplo que dan y me gustaría replicar exactamente en python.

curl -F 'access_token=...' \ 
    -F 'message=Hello, Arjun. I like this new API.' \ 
    https://graph.facebook.com/arjun/feed 

¿Alguien puede ayudarme a entender esto?

Respuesta

14

Puede utilizar httplib al poste con Python o el nivel más alto urllib2

import urllib 

params = {} 

params['access_token'] = '*****' 
params['message'] = 'Hello, Arjun. I like this new API.' 

params = urllib.urlencode(params) 
f = urllib.urlopen("https://graph.facebook.com/arjun/feed", params) 
print f.read() 

También hay una biblioteca de más alto nivel específico Facebook para Python que hace todo el POST-ción para usted.

https://github.com/pythonforfacebook/facebook-sdk/

https://github.com/facebook/python-sdk

+0

exactamente lo que necesitaba - gracias! – Ron

1

¿Por qué usan rizo en el primer lugar?

Python tiene extensas bibliotecas para Facebook e incluye bibliotecas para solicitudes web, llamar a otro programa y recibir resultados no es necesario.

Dicho esto,

Primera desde Python Doc

data puede haber una cadena que especifica datos adicionales a enviar al servidor, o None si no se necesita este tipo de datos. Actualmente las solicitudes HTTP son las únicas que usan datos; la solicitud HTTP será POST en lugar de GET cuando se proporcione el parámetro de datos. data debe ser un buffer en el formato estándar application/x-www-form-urlencoded. La función urllib.urlencode() toma una asignación o secuencia de 2 tuplas y devuelve una cadena en este formato. El módulo urllib2 envía las solicitudes HTTP/1.1 con Connection: close header incluido.

Así,

import urllib2, urllib 
parameters = {} 
parameters['token'] = 'sdfsdb23424' 
parameters['message'] = 'Hello world' 
target = 'http://www.target.net/work' 

parameters = urllib.urlencode(parameters) 
handler = urllib2.urlopen(target, parameters) 
while True: 
    if handler.code < 400: 
     print 'done' 
     # call your job 
     break 
    elif handler.code >= 400: 
     print 'bad request or error' 
     # failed 
     break