Python3 : JSON POST Request WITHOUT requests library

标签 python json urllib

我想仅使用 native 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 Error 500: Internal Server Error

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

最佳答案

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

编码为 JSON 并设置正确的 header :

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"
}

关于Python3 : JSON POST Request WITHOUT requests library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491541/

相关文章:

python - 如何在 Python 中将列表列表中的一个值与列表列表中的另一个值进行比较

java - Spring Boot POST 参数大小限制

json - 如何使用 Swift 和 Alamofire 连接 http 服务器

json - HTTPResponse' 对象没有属性 'decode

python - 使用 BeautifulSoup 从网站获取图像 src

python - 如何检查 "if condition"并即时分配? (Python)

python - 为什么我不能直接向任何 python 对象添加属性?

android - 无法解析此多级 json 数据

python - Scrapy:重试图像下载后出现错误10054

使用 numpy 的 Python 数组