带有GZIPOutputStream的Unirest post不能与python Flask api一起使用

2024-06-16 12:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

[发布]>;。错误400错误请求:未能解码JSON对象:“utf-8”编解码器无法解码位置1中的字节0x8b:解压缩时起始字节无效\“,)。在加载中\n s=s.decode(encoding)\nUnicodeDecodeError:“utf-8”编解码器无法解码位置1中的字节0x8b:无效的开始字节\n\n在处理上述异常时,发生了另一个异常

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

我有以下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)


以下是Pyton测试代码

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

Tags: 代码selfjsonobjdata字节request错误
1条回答
网友
1楼 · 发布于 2024-06-16 12:21:10

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

Java头是“接受编码”、“gzip”

python头是“内容编码”:“gzip”

如果request.content\u编码为“gzip”,则存在签入post方法。这种情况是对Java代码进行归档并导致问题。使两种情况下的标题相同。代码运行良好

相关问题 更多 >