【问题标题】:Python and urllib2: how to make a GET request with parametersPython 和 urllib2:如何使用参数发出 GET 请求
【发布时间】:2011-02-18 09:13:08
【问题描述】:

我正在构建一个“API API”,它基本上是一个内部 REST Web 服务的包装器,Web 应用程序将向该服务发出大量请求。 一些 Web 服务调用需要是 GET 而不是 post,而是传递参数。

是否有“最佳实践”方法将字典编码为查询字符串?例如:?foo=bar&bla=blah

我正在查看urllib2 docs,看起来它会根据您是否传递参数自行决定使用 POST 还是 GET,但也许有人知道如何将 params 字典转换为GET 请求。

也许有这样的包吗?如果它支持 keep-alive 那就太好了,因为 Web 服务器会不断地从 REST 服务请求东西。

理想情况下,也可以将 XML 转换为某种可遍历的 python 对象。

谢谢!

【问题讨论】:

    标签: python urllib2


    【解决方案1】:

    urllib.urlencode()还不够吗?

    >>> import urllib
    >>> urllib.urlencode({'foo': 'bar', 'bla': 'blah'})
    foo=bar&bla=blah
    

    编辑:

    你也可以更新现有的url:

      >>> import urlparse, urlencode
      >>> url_dict = urlparse.parse_qs('a=b&c=d')
      >>> url_dict
      {'a': ['b'], 'c': ['d']}
      >>> url_dict['a'].append('x')
      >>> url_dict
      {'a': ['b', 'x'], 'c': ['d']}
      >>> urllib.urlencode(url_dict, True)
      'a=b&a=x&c=d'
    

    请注意,parse_qs 函数在 Python 2.6 之前位于 cgi 包中

    23/04/2012 编辑:

    你也可以看看python-requests - 它最终会杀死 urllibs :)

    【讨论】:

    • 我希望有一些聪明的东西,并且知道如何将变量添加到已经有一些查询字符串参数的 URL。例如给定一个像example.com?foo=bar 这样的网址,如果你自己附加字符串,你必须担心不重复问号等等。但我想这留给开发人员作为练习
    • +1 用于提及 python 请求。谢谢你,你拯救了我的一天!! Requests 超级棒,比复杂的 urllib 和 urllib2 好多了。我希望每个人都停止使用 urllib 和 urllib2 来支持请求...
    【解决方案2】:

    urllib.urlencode

    是的,urllib / urllib2 的分工在 Python 2.x 中有点混乱。

    【讨论】:

    • 是的,它是..您对使用什么进行 XML 解析有什么建议吗? xml的内置包好像有很多种,不知道哪个更合适。在这种情况下,轻量级获胜。谢谢
    • 我只使用 BeautifulStoneSoup 来解析 XML,因为它可以正常工作(一旦你学习了模型)。 crummy.com/software/BeautifulSoup
    • 有minidom,但根据我有限的经验,我可以说lxml是一种方法
    【解决方案3】:
    import urllib
    data = {}
    data["val1"] = "VALUE1"
    data["val2"] = "VALUE2"
    data["val3"] = "VALUE3"
    url_values = urllib.urlencode(data)
    url = "https://www.python.org"
    print url + "?" + url_values
    

    url_values 是一个编码值,可用于与 url 作为查询 string(url+"?"+url_values) 一起发布到服务器。

    【讨论】:

    • 您应该尝试解释这是一个答案。如果这确实为问题提供了答案,它是如何做到的?您在此做了哪些工作以使其有效并解决问题?
    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2016-10-21
    相关资源
    最近更新 更多