0

将压缩的有效负载从 Java 客户端 (Unirest) 发布到 Flask Api 时出现以下错误。

[发布]>。错误 400 错误请求:无法解码 JSON 对象:“utf-8”编解码器无法解码位置 1 中的字节 0x8b:解压缩时起始字节无效。\",). in loading\ns = s.decode(encoding)\nUnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte\n\n在处理上述异常时,又出现了一个异常发生了

有效负载以压缩格式传递。发布请求在 python 测试代码中运行良好。

我有以下 java 发布请求。

  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'})
4

1 回答 1

0

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

Java 标头是“Accept-Encoding”、“gzip”

python头是'内容编码':'gzip'

如果 request.content_encoding 是 'gzip' ,则有检查 post 方法 。这种情况是申请 Java 代码并导致问题。在两种情况下都使标题相同。代码工作正常。

于 2020-06-01T16:11:56.013 回答