我正在使用http://loopj.com/android-async-http/中的AsyncHttpClient库,让它可以调用Web服务来检索JSON响应。我现在正试图调用一个Web服务,通过HTTP将文件流回客户端。因此我使用BinaryHttpResponseHandler来捕获返回的byte []数据。但是,每当我尝试调用该方法时它都会失败,并且在检查Throwable对象时,异常是'org.apache.http.client.HttpResponseException:不允许Content-Type! ”。
我已尝试根据文档指定允许的内容类型列表,但这并没有什么不同。我主要是流式传输PDF,但理想情况下我不想指定内容类型列表,我希望能够下载任何文件类型。我正在使用的代码如下:
AsyncHttpClient httpClient = new AsyncHttpClient();
String[] allowedContentTypes = new String[] { "application/pdf", "image/png", "image/jpeg" };
httpClient.get(myWebServiceURL, new BinaryHttpResponseHandler(allowedContentTypes) {
@Override
public void onSuccess(byte[] binaryData) {
// ....
}
@Override
public void onFailure(Throwable error, byte[] binaryData) {
// ....
Log.e("Download-onFailure", error.getMessage());
}
});
我也尝试过不指定任何内容类型,只需使用:
new BinaryHttpResponseHandler()
但这没有任何区别。
答案 0 :(得分:6)
忽略我,BinaryHttpResponseHandler没有任何问题。我从Web服务中提取的文件是PDF,JPG,PNG等,因此我允许使用application / pdf,image / jpeg,image / png的内容类型。但是我使用WireShark来检查返回的HTTP响应标头,发现内容类型实际上是'text / html;字符集= ISO-8859-1' 。一旦我将其添加到允许的内容类型,一切正常。
答案 1 :(得分:2)
添加以下方法以查看“未接受”内容
public void sendResponseMessage(HttpResponse response) {
System.out.println(response.getHeaders("Content-Type")[0].getValue());
}
对我来说是结果“image / png; charset = UTF-8”
然后添加它;)
答案 2 :(得分:1)
我发现BinaryHttpResponseHandler.java
中的代码如下:
boolean foundAllowedContentType = false;
for(String anAllowedContentType : mAllowedContentTypes) {
if(anAllowedContentType.equals(contentTypeHeader.getValue())) {
foundAllowedContentType = true;
}
}
您似乎必须列出您想要接收的所有类型。
答案 3 :(得分:1)
您可以准确检查Web服务返回的文件类型。只需覆盖onFailure
中的BinaryHttpResponseHandler
,就像这样:
@Override
public void onFailure(int statusCode, Header[] headers, byte[] binaryData, Throwable error)
{
Log.e(TAG, "onFailure!"+ error.getMessage());
for (Header header : headers)
{
Log.i(TAG, header.getName()+" / "+header.getValue());
}
}
希望这有帮助
答案 4 :(得分:0)
尝试添加*/*
String[] allowedContentTypes = new String[] { "*/*", "application/pdf", "image/png", "image/jpeg" };
答案 5 :(得分:0)
添加“application / octet-stream”作为允许的类型对我有用!
干杯
答案 6 :(得分:0)
我遇到了同样的问题。我检查了来源。网址如下
android-async只支持两个Content-Type:“image / jpeg”,“image / png”。
我认为如果您需要Content-Type,则需要覆盖该类。
答案 7 :(得分:0)
就这样做:
String[] allowedContentTypes = new String[] { "image/jpeg;charset=utf-8", "image/jpeg;charset=utf-8" };
没关系。
答案 8 :(得分:0)
有同样的问题。经过一段时间的努力,想出了解决方案来添加"。"在内容类型的末尾,以防止指定实际内容类型和字符集的所有组合:
String[] allowedContentTypes = new String[] { "application/pdf.*", "image/png.*", "image/jpeg.*" };