【问题标题】:HttpsUrlConnection response returned from servlet contains extra 'b''0''\r\n' characters when read through python library通过 python 库读取时,从 servlet 返回的 HttpsUrlConnection 响应包含额外的 'b''0''\r\n' 字符
【发布时间】:2016-03-01 20:02:11
【问题描述】:

我正在使用 HttpsURLConnection 调用服务器并从我的 servlet 返回从 HttpsURLConnection 返回的响应。我正在使用流将响应从 HttpssURLConnection 复制到 HttpServletresponse,将字节从 httpconnection 响应输入流复制到响应的输出流,通过查看 read 是否返回

以下是复制响应的代码。变量response 的类型为HttpServletResponse,变量httpCon 的类型为HttpsURLConnection

InputStream responseStream = httpCon.getInputStream();    
if (responseStream != null)
{
  OutputStream os = response.getOutputStream();
  byte[] buffer = new byte[1024];
  int len;
  while ((len = responseStream.read(buffer)) >= 0)
  {
    os.write(buffer, 0, len);
  }
  os.flush();
  os.close();
}

在客户端,我使用 python 请求库来读取响应。

我看到的是,如果我使用 curl 测试我的 servlet,我会得到正确的响应 json,response = u'{"key":"value"}'

如果我从请求 python 中读取它,它会在响应中添加一些额外的字符,响应如下所示 response = u'b0\r\n{"key":"value"}\r\n0\r\n\r\n'

两个字符串都是 unicode。但是第二个有多余的字符。

如果我从 curl/Postman restclient 尝试同样的反应,我能够正确地得到它。但是从 python 请求中,它不起作用。我在 python 中尝试了另一个 livetest 库,它也不起作用,响应具有相同的字符。我也尝试更改接受编码标头,但没有任何效果。

因此,我无法解析 json。 我不想更改客户端来解析这种字符串。 我可以更改服务器上的某些内容以使其正常工作吗?

【问题讨论】:

  • 显示复制代码?
  • 更新了用于复制响应的代码
  • 是的,复制代码很好。响应前面的 u 是怎么回事?您确定您在 Python 中以 unicode 格式阅读吗?可能是编码不匹配...
  • u 是 unicode。我只是在 python 中使用 requests 库。
  • 你可以忽略 u,它不是字符串的一部分,而在另一种情况下,字符 b0\r\n 是字符串的一部分。

标签: java python servlets python-requests httpsurlconnection


【解决方案1】:

响应是否包含以下标头“Transfer-Encoding: chunked”?

响应应采用分块传输编码 https://en.wikipedia.org/wiki/Chunked_transfer_encoding.

在这种情况下,您会在响应结束时得到 \r\n0\r\n\r\n,这与预期的一样,因为它是此编码的终止符号。我客串 curl/Postman 只是帮我们处理分块传输编码,所以你找不到这些分块符号。

【讨论】:

    猜你喜欢
    • 2016-08-07
    • 2015-03-26
    • 2016-04-16
    • 2020-03-02
    • 2011-09-01
    • 2023-03-05
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多