安卓HTTPUrlConnection响应返回垃圾数据

11

这是我的代码来处理输入流的头部

mResponseCode = connection.getResponseCode();

mError = mResponseCode != 200 && mResponseCode != 201 && mResponseCode != 202;

if (mError) {
    inputStream = connection.getErrorStream();
} else {
    inputStream = connection.getInputStream();
}
inputStreamReader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(inputStreamReader);

String inputLine;
final StringBuilder builder = new StringBuilder();

while ((inputLine = bufferedReader.readLine()) != null)
    builder.append(inputLine);

resultStr = builder.toString();

但是该字符串返回的值像这样"���������������}"

响应头包括Content-Type: application/json; charset=UTF-8,所以我尝试添加

inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));

但没有帮助。

它在Postman上运行得很完美,所以我知道这不是服务出了问题。

有人可以提供一些帮助吗?


如果您指的是传输编码,则为分块传输编码,内容类型为application/json; charset=UTF-8。 - Naveen Dissanayake
是的,返回的数据没错!但这更像是一个编码问题。 - Ali
@Ali 谢谢你啊。显然它被压缩了。 - Naveen Dissanayake
@NaveenDissanayake 请注意,如果设置了 Content-Encoding: compressed,库应该自动处理压缩。 - Tassos Bassoukos
@TassosBassoukos 这就是问题所在,响应没有内容编码。不管怎样,感谢您的帮助。 - Naveen Dissanayake
显示剩余4条评论
1个回答

3

一些服务会尝试通过头部参数来压缩它们生成的数据,例如:

Content-Encoding: 某种编码方式

如果要禁用此功能,请尝试设置接受编码方式:

connection.setRequestProperty("Accept-Encoding", "identity");

如果您想在手机上节省一些传输数据,请使用以下方法:

connection.setRequestProperty("Accept-Encoding", "gzip"); //optional forcing gzip
//...
inputStream = new GZIPInputStream(connection.getInputStream());
//rest of the code    

1
是的,对我来说看起来像是压缩文件。至少楼主可以确认一下是否有压缩头或者这个答案是否可行。 - Fabio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接