【问题标题】:urllib2 and jsonurllib2 和 json
【发布时间】:2011-03-18 11:01:10
【问题描述】:

谁能指出一个教程,向我展示如何使用 urllib2 进行 POST 请求,数据为 JSON 格式?

【问题讨论】:

    标签: python json urllib2


    【解决方案1】:

    Messa 的答案仅在服务器不费心检查内容类型标头时才有效。如果您希望它真正起作用,您需要指定一个内容类型标题。这是 Messa 的答案修改为包含内容类型标题:

    import json
    import urllib2
    data = json.dumps([1, 2, 3])
    req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
    f = urllib2.urlopen(req)
    response = f.read()
    f.close()
    

    【讨论】:

    • 使用 python3 和 urllib,另外我必须对我的 json 解析数据进行编码,以使其正常工作data = json.dumps([1, 2, 3]).encode("utf8)。见stackoverflow.com/a/5441022/3757139
    • 是否也应该使用data = urllib.parse.urlencode(data)
    • 对 json 有效负载进行 urlencoding 对于像这样的 post 请求是不正常的,其中 json 对象将进入 post body。如果您将 json 数据放入 url 的查询字符串中,则需要对其进行编码。但是,对 json 字符串进行 urlencoding 并不是 urlencode 的设计目的。您提出这个问题的方式或原因似乎有些奇怪,您可能想发一个新帖子并更全面地提出您的问题
    【解决方案2】:

    无论 urllib 使用什么来计算 Content-Length 似乎都被 json 混淆了,所以你必须自己计算。

    import json
    import urllib2
    data = json.dumps([1, 2, 3])
    clen = len(data)
    req = urllib2.Request(url, data, {'Content-Type': 'application/json', 'Content-Length': clen})
    f = urllib2.urlopen(req)
    response = f.read()
    f.close()
    

    我花了很长时间才弄清楚这一点,所以我希望它对其他人有所帮助。

    【讨论】:

    • 非常感谢您! 5年后,这仍然是坏的!
    • 我可以验证,至少在较旧的 Python(特别是 2.6)中,除非您在此答案中设置 Content-Length,否则没有任何效果!
    【解决方案3】:

    示例 - 将一些编码为 JSON 的数据作为 POST 数据发送:

    import json
    import urllib2
    data = json.dumps([1, 2, 3])
    f = urllib2.urlopen(url, data)
    response = f.read()
    f.close()
    

    【讨论】:

    • 对于许多系统,这不起作用。请参阅下面 Bob Van Zant 的回答。
    【解决方案4】:

    要读取 json 响应,请使用 json.loads()。这是示例。

    import json
    import urllib
    import urllib2
    
    post_params = {
        'foo' : bar
    }
    
    params = urllib.urlencode(post_params)
    response = urllib2.urlopen(url, params)
    json_response = json.loads(response.read())
    

    【讨论】:

    • 这不发送 JSON 它只接收它。
    【解决方案5】:

    您当然想破解标头以获得正确的 Ajax 请求:

    headers = {'X_REQUESTED_WITH' :'XMLHttpRequest',
               'ACCEPT': 'application/json, text/javascript, */*; q=0.01',}
    request = urllib2.Request(path, data, headers)
    response = urllib2.urlopen(request).read()
    

    然后到 json.loads 服务器端的 POST。

    编辑:顺便说一句,您必须在发送之前urllib.urlencode(mydata_dict)。如果你不这样做,POST 将不会是服务器所期望的

    【讨论】:

    • urlencode 将发送以 url 格式编码的数据,而不是 json。
    【解决方案6】:

    这对我有用:

    import json
    import requests
    url = 'http://xxx.com'
    payload = {'param': '1', 'data': '2', 'field': '4'}
    headers = {'content-type': 'application/json'}
    r = requests.post(url, data = json.dumps(payload), headers = headers)
    

    【讨论】:

    • 我不认为 requests 包是标准库的一部分。
    • 虽然 'requests' 包不是标准库的一部分,但使用 pip 很容易安装。非常适合在虚拟环境中工作的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多