【问题标题】:HTTPConnection.request fails but urllib.request.urlopen works?HTTPConnection.request 失败但 urllib.request.urlopen 有效?
【发布时间】:2012-07-20 00:23:13
【问题描述】:

我在这里被困了很长一段时间,但找不到任何有用的东西。 我正在尝试连接到一个网站并在 Python3 中获取响应 json 文件。代码如下:

conn = http.client.HTTPConnection('host.address')
params = "xx"+ xx + "xx" + ...
conn.request('GET', '/a/b/c', params)
resp = conn.getresponse()

这实际上不会返回json文件而是网页http://host.address/a/b/c,这是一个错误页面。 但是,在使用以下代码时:

params = "xx"+ xx + "xx" + ...
resp = urllib.request.urlopen("http://host.address/a/b/c?"+params)

它会正确返回 json 文件。 知道代码有什么问题吗?

谢谢

【问题讨论】:

    标签: python-3.x urlopen


    【解决方案1】:

    在 HTTP 中,只有 POST 请求才应该有正文。 request() 的第三个参数实际上是正文(参见http://docs.python.org/py3k/library/http.client.html#http.client.HTTPConnection.request) - 只需按照第二个示例构建 URL。

    【讨论】:

      【解决方案2】:

      只是用一个例子来补充@sqrtsben 的答案:

      import urllib.parse
      import http.client
      
      u = urllib.parse.urlparse("http://localhost:8080/index.php?utf8=✓")
      conn = http.client.HTTPConnection(u.hostname, u.port)
      if u.query == '':
          conn.request("GET", u.path)
      else:
          conn.request("GET", u.path + '?' + u.query)
      

      【讨论】:

        猜你喜欢
        • 2011-07-08
        • 2014-06-07
        • 2017-06-23
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 2017-08-18
        • 1970-01-01
        相关资源
        最近更新 更多