我正在发送的封闭源应用程序有问题 标头中的内容类型不正确。
我收到的数据为“内容类型:application / x-www-form-urlencoded”
我应该以“内容类型:application / json”的形式接收它
以下是Flask和Flask-restful的Flask服务器代码
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource, request
TEST_PROXY = "0.0.0.0"
TEST_PROXY_PORT = 1885
DEBUG = True
app = Flask(__name__)
api = Api(app)
class TEST(Resource):
def get(self, queue, subqueue):
parser = reqparse.RequestParser()
parser.add_argument('m', type=str, help='A message')
args = parser.parse_args()
TEST_queue = f'/{queue}/{subqueue}'
message = args.get('m')
return {'type': 'GET',
'message': args.get('m'),
'queue': TEST_queue}
def post(self, queue, subqueue):
TEST_queue = f'/{queue}/{subqueue}'
# here is the problem
# because of the incorrect header
# the returned data is empty.
message = request.data
return {'type': 'POST',
'message-length': len(message),
'queue': TEST_queue}
api.add_resource(TEST, '/TEST/<string:queue>/<string:subqueue>')
if __name__ == '__main__':
app.run(debug=DEBUG, host=TEST_PROXY, port=TEST_PROXY_PORT)
发送
POST http://localhost:1885/TEST/sub/sub2
Content-Type: application/json
{"status": {"current_time": "now"}}
有效。 request.data充满了内容
POST http://localhost:1885/TEST/sub/sub2
Content-Type: application/x-www-form-urlencoded
{"status": {"current_time": "now"}}
可以工作,但是requests.data现在为空,相反,数据已被解析并且不再以不变的形式可用。
由于发件人是封闭源,因此无法在短时间内解决该问题。
是否有一种方法可以为POST请求/此请求覆盖错误的内容类型,以便我可以访问原始的发布数据?
答案 0 :(得分:0)
您可以使用request.get_data()
代替request.data
。
来自docs:
data
以字符串形式包含传入的请求数据,以防Werkzeug不能处理。
和
get_data(cache=True, as_text=False, parse_form_data=False)
这将从客户端读取缓冲的传入数据读取为一个字节串。默认情况下会缓存它,但是可以通过将cache设置为False来更改行为。通常,在不首先检查内容长度的情况下调用此方法是一个坏主意,因为客户端可能会发送数十兆字节或更多的字节数,从而导致服务器出现内存问题。
但是最好检查request.content_type
中的值并从request.json
和request.form
获取数据。