【问题标题】:How to use urllib2.urlopen to make POST request without data argument如何使用 urllib2.urlopen 发出没有数据参数的 POST 请求
【发布时间】:2012-03-02 22:10:23
【问题描述】:

我正在尝试使用 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/invited/USER_ID 发出 HTTP GET:

欣赏输入。

【问题讨论】:

    标签: python facebook-graph-api urllib2 urlopen


    【解决方案1】:

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

    如果您设置 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

    【讨论】:

    • 正是我想要的!非常感谢!
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      直接来自 Python (urllib2) 文档

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

      【讨论】:

        【解决方案4】:

        我认为你已经回答了你自己的问题,只是你想多了......

        • 邀请用户使用 urlopen 发布 POST

        • 要检查是否已邀请用户,请发出带有 urlopen 的 GET。

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

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

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

        【讨论】:

        • 感谢您的回答,我知道其中的区别。但是由于 urlopen 只在提供 data 参数时发送 POST 请求,所以我不知道如果我没有任何参数该怎么办(developers.facebook.com/docs/reference/api 有一些没有参数的 POST 操作的情况)
        • 所以对于 GET 不要使用数据,只需提供 URL 中的参数。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 2017-09-13
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多