使用具有多个标头的urllib发出POST请求会产生400错误的请求错误

时间:2018-11-27 12:53:01

标签: python python-3.x post http-headers urllib

我使用过requests库,并且我知道如何使用它,但是我只需要使用标准库,因此,如果您不鼓励我使用requests,我将不胜感激。 。

我制作了一个处理POST请求的烧瓶服务器,然后从另一个脚本中调用 urllib 对烧瓶服务器进行POST调用。 我需要像在Postman中一样在正文中发送原始json。

烧瓶服务器

from flask import Flask, request

app = Flask(__name__)
@app.route('/random', methods=['POST'])
def random():
    if request.method == 'POST':
        if request.headers.get('Authorization') and request.headers.get('Content-Type') == 'application/json':
            print(request.get_json())
            return "Success"
        else:
            print(request.get_json())
            return "Bad request"

app.run(host='0.0.0.0', port=5000, debug=True)

Urllib客户端(保存为test.py)-

import urllib.request
import urllib.parse
d = {"spam": 1, "eggs": 2, "bacon": 0}
data = urllib.parse.urlencode(d)
data = data.encode()
req = urllib.request.Request("http://localhost:5000/random", data)
req.add_header('Content-Type', 'application/json')
req.add_header('Authorization', 12345)
with urllib.request.urlopen(req) as f:
    print(f.read().decode('utf-8'))

仅使用 Authorization 标头,我得到Bad Request作为输出,而烧瓶服务器端的json是None符合预期

仅使用Content-Type标头或两个标头,我都会收到此错误-

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    with urllib.request.urlopen(req) as f:
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: BAD REQUEST

整个过程很简单,但是我不明白为什么会这样,并且错误消息也无济于事。

1 个答案:

答案 0 :(得分:0)

服务器在id county cat brand month 1 GB x1 xx 12 1 GB x2 x1 08 中发生故障。仅当客户端发送两个标头时才会发生,因为那是到达该行的时间。

要解决此问题,请更改客户端以将数据作为JSON发送:

request.get_json()

我希望这对您有帮助