Unirest post with GZIPOutputStream not working with python Flask api.

问题描述 投票:0回答:1

当从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 utf-8 gzip gzipoutputstream
1个回答
0
投票

在Java和python测试用例中,头是不同的。

Java头是 "Accept-Encoding","gzip"

python头是'Content-Encoding': 'gzip'。

有在岗位上检查的方法 如果 request.content_encoding 是'gzip'. 这个条件是对Java代码进行备案,并导致问题。在两种情况下都做了相同的头。代码工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.