Android AsyncHttpClient - “不允许内容类型!”下载文件时

时间:2012-09-12 11:51:38

标签: android http content-type android-async-http

我正在使用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() 

但这没有任何区别。

9 个答案:

答案 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)

我遇到了同样的问题。我检查了来源。网址如下

https://github.com/loopj/android-async-http/blob/master/library/src/main/java/com/loopj/android/http/BinaryHttpResponseHandler.java

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.*" };