当从Java客户端(Unirest)向Flask Api发布压缩的有效载荷时,出现以下错误。
[POST]>。错误400 坏的请求。解码JSON对象失败:'utf-8'编解码器无法解码位置1的字节0x8b:解压时无效的起始字节。\in loadsn s = s.decode(encoding)\nUnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byten\n在处理上述异常时,发生了另一个异常
有效载荷是以压缩格式传递的。在python测试代码中,post请求工作正常。
我有以下java post请求。
public void PostData() throws Exception {
String payload = "{\"FirstName\": \"ABC\", \"LastName\": \"XYZ\"}";
ByteArrayOutputStream obj = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(obj);
gzip.write(payload.getBytes("UTF-8"));
gzip.close();
HttpResponse<JsonNode> jsonResponse
= Unirest.post("http://localhost:5000/service")
.header("Accept-Encoding", "gzip")
.body(obj.toByteArray())
.asJson();
}
下面的python代码正在接收请求。 修改了代码,使其变得简单。该代码在.decode('utf8')处失败。
def post(self):
payload = json.loads(gzip.decompress(request.data).decode('utf8')) if request.content_encoding is 'gzip' else request.get_json('data')
return Response(payload, status=201)
以下是工作中的pyhton测试代码
def test_post(self):
payload = {'FirstName': 'ABC', 'LastName': 'XYZ'}
payload = gzip.compress(json.dumps(payload).encode())
resp = self._client.post('/service', data=payload, headers={'Content-Encoding': 'gzip'})
在Java和python测试用例中,头是不同的。
Java头是 "Accept-Encoding","gzip"
python头是'Content-Encoding': 'gzip'。
有在岗位上检查的方法 如果 request.content_encoding 是'gzip'. 这个条件是对Java代码进行备案,并导致问题。在两种情况下都做了相同的头。代码工作正常。