使用带有多个 headers 的 urllib 发出 POST 请求会出现 400 Bad Request 错误
Making a POST request using urllib with multiple headers gives 400 Bad Request error
我用过 requests
库,我知道如何使用它,但我只需要使用标准库,所以如果你不鼓励我使用 [=15=,我将不胜感激] 反而。
我制作了一个处理 POST 请求的 Flask 服务器,然后我从另一个脚本调用 urllib 来对 Flask 服务器进行 POST 调用。 我需要像在 Postman 中一样在 body 中发送原始 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 Client(另存为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 header 我得到 Bad Request
作为输出并且 json 在 flask 服务器端是 None
符合预期。
只有 Content-Type header 或两个 header 我得到这个错误 -
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
整个事情很简单,但我无法理解为什么会这样,错误消息也没有多大帮助。
服务器在 request.get_json()
出现故障。只有当客户端同时发送 headers 时才会发生,因为那是它到达这一行的时候。
要修复它,请更改客户端以将数据发送为 JSON:
import json # <-- Import json
import urllib.request
import urllib.parse
d = {"spam": 1, "eggs": 2, "bacon": 0}
data = json.dumps(d) # <-- Dump the dictionary as JSON
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'))
希望对您有所帮助
我用过 requests
库,我知道如何使用它,但我只需要使用标准库,所以如果你不鼓励我使用 [=15=,我将不胜感激] 反而。
我制作了一个处理 POST 请求的 Flask 服务器,然后我从另一个脚本调用 urllib 来对 Flask 服务器进行 POST 调用。 我需要像在 Postman 中一样在 body 中发送原始 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 Client(另存为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 header 我得到 Bad Request
作为输出并且 json 在 flask 服务器端是 None
符合预期。
只有 Content-Type header 或两个 header 我得到这个错误 -
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
整个事情很简单,但我无法理解为什么会这样,错误消息也没有多大帮助。
服务器在 request.get_json()
出现故障。只有当客户端同时发送 headers 时才会发生,因为那是它到达这一行的时候。
要修复它,请更改客户端以将数据发送为 JSON:
import json # <-- Import json
import urllib.request
import urllib.parse
d = {"spam": 1, "eggs": 2, "bacon": 0}
data = json.dumps(d) # <-- Dump the dictionary as JSON
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'))
希望对您有所帮助