如何使用urllib2.urlopen在没有数据参数的情况下发出POST请求

时间:2012-03-02 22:10:24

标签: python facebook-graph-api urllib2 urlopen

我正在尝试使用urllib2.urlopen通过Facebook Graph API执行GET和POST请求。我从这里注意到:https://stackoverflow.com/questions/2690723/facebook-graph-api-and-django 我可以很容易地执行GET请求。

从这里开始:How to send a POST request using django?和Python文档http://docs.python.org/library/urllib2.html似乎需要数据参数来执行POST请求。

但是看看Facebook的API:http://developers.facebook.com/docs/reference/api/event/#invited它说

  

您可以通过发出HTTP POST来邀请用户参加活动   / EVENT_ID /邀请/ USER_ID

我不确定如何使用urlopen,因为直接打开此URL只会检查用户是否已被邀请,如API页面所述:

  

您可以检查特定用户是否已被邀请参加活动   向/ EVENT_ID / invite / USER_ID发出HTTP GET:

欣赏输入。

4 个答案:

答案 0 :(得分:36)

听起来你想发送一个空的POST请求,即使urllib2.urlopen()只在你指定数据参数时发送一个帖子。

如果设置data ="",它实际上发送一个空的POST,并且仅当data = None时才发出GET请求:

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 -

希望有所帮助。我从小HTTP服务器获得了响应打印输出,他们在这里有一个示例:http://docs.python.org/library/simplehttpserver.html

答案 1 :(得分:2)

发送空POST的另一种方法是创建一个Request并覆盖其get_method。在这种情况下,这是更多的工作,但在其他情况下可能更干净(例如,如果您已经有请求)。

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

get_method是一个返回要使用的方法的方法,所以我们在这里用一个返回'POST'的lambda函数覆盖它。

答案 2 :(得分:2)

直接来自Python (urllib2)文档

urllib2.urlopen(url [,data] [,timeout]) 打开URL url,可以是字符串或Request对象。 警告HTTPS请求不会对服务器的证书进行任何验证。 数据可以是指定要发送到服务器的其他数据的字符串,如果不需要此类数据,则为无。目前,HTTP请求是唯一使用数据的请求; 提供数据参数时,HTTP请求将是POST而不是GET。

答案 3 :(得分:0)

我认为你几乎已经回答了自己的问题,你只是过度思考......

  • 邀请用户使用urlopen发出POST

  • 要检查用户是否已被邀请,请发出带有详细信息的GET。

在这两种情况下,您都在使用相同的URL进行通信,区别在于GET或POST。

如果您不确定GET和带有urlopen的POST之间的区别,请阅读以下文档:

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