【问题标题】:Python3: JSON POST Request WITHOUT requests libraryPython3:没有请求库的 JSON POST 请求
【发布时间】:2014-10-18 22:27:47
【问题描述】:

我想仅使用本机 Python 库将 JSON 编码数据发送到服务器。我喜欢请求,但我根本无法使用它,因为我无法在运行脚本的机器上使用它。我需要不这样做。

newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} 
params = urllib.parse.urlencode(newConditions)
params = params.encode('utf-8')

req = urllib.request.Request(conditionsSetURL, data=params)
urllib.request.urlopen(req)        

我的服务器是本地 WAMP 服务器。我总是得到一个

urllib.error.HTTPError: HTTP 错误 500: 内部服务器错误

100% 确定不是服务器问题,因为相同的数据,相同的 url,在同一台机器上,在同一台服务器上工作使用 requests 库和 Postman。

【问题讨论】:

    标签: python json urllib


    【解决方案1】:

    您不是在发布 JSON,而是在发布 application/x-www-form-urlencoded 请求。

    编码为 JSON 并设置正确的标头:

    import json
    
    newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} 
    params = json.dumps(newConditions).encode('utf8')
    req = urllib.request.Request(conditionsSetURL, data=params,
                                 headers={'content-type': 'application/json'})
    response = urllib.request.urlopen(req)
    

    演示:

    >>> import json
    >>> import urllib.request
    >>> conditionsSetURL = 'http://httpbin.org/post'
    >>> newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} 
    >>> params = json.dumps(newConditions).encode('utf8')
    >>> req = urllib.request.Request(conditionsSetURL, data=params,
    ...                              headers={'content-type': 'application/json'})
    >>> response = urllib.request.urlopen(req)
    >>> print(response.read().decode('utf8'))
    {
      "args": {}, 
      "data": "{\"con4\": 40, \"con2\": 20, \"con1\": 40, \"password\": \"1234\", \"con3\": 99}", 
      "files": {}, 
      "form": {}, 
      "headers": {
        "Accept-Encoding": "identity", 
        "Connection": "close", 
        "Content-Length": "68", 
        "Content-Type": "application/json", 
        "Host": "httpbin.org", 
        "User-Agent": "Python-urllib/3.4", 
        "X-Request-Id": "411fbb7c-1aa0-457e-95f9-1af15b77c2d8"
      }, 
      "json": {
        "con1": 40, 
        "con2": 20, 
        "con3": 99, 
        "con4": 40, 
        "password": "1234"
      }, 
      "origin": "84.92.98.170", 
      "url": "http://httpbin.org/post"
    }
    

    【讨论】:

    • 请求类型(即post)在哪里标识?
    • @Startec:通过使用data 参数,Request 对象从 GET 切换到 POST。
    • @Startec:你不能。有关解决方法,请参阅 How to make HTTP DELETE method using urllib2?
    • @Startec: newConditionsPython 字典,而不是 JSON 字符串。
    • @Startec: 不,json.dumps() 生成一个 JSON 编码字符串,其中的整数仍然是 (JSON) 整数。任何兼容的 JSON 解码器都会再次为您提供整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多