Volley ImageLoader 对某些 https url 给出 403 响应

Volley ImageLoader gives 403 response for some https url

我在我的项目中使用 Volley Library

我正在使用 ImageLoader 加载和显示来自 https url 的图像。

例如:

ImageLoader mImageLoader;
ImageView mImageView;
// The URL for the image that is being loaded.
private static final String IMAGE_URL =
    "https://developer.android.com/images/training/system-ui.png";
...
mImageView = (ImageView) findViewById(R.id.regularImageView);

// Get the ImageLoader through your singleton class.
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
         R.drawable.def_image, R.drawable.err_image));

它成功加载了一些图像,但不是全部。

对于某些图片,我得到以下错误响应:

BasicNetwork.performRequest: Unexpected response code 403 for https://developer.android.com/images/training/system-ui.png

有解决此问题的方法吗?

我试过你的代码,但它对我来说似乎工作正常。

发送方法ImageRequest:

 private void sendImageRequest() {
        final String IMAGE_URL =
                "https://developer.android.com/images/training/system-ui.png";
        ImageRequest request = new ImageRequest(IMAGE_URL,
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        Log.e("Image Sucess", bitmap.toString());
//                        mImageView.setImageBitmap(bitmap);
                        imageView.setImageBitmap(bitmap);
                    }
                }, 0, 0, null,
                new Response.ErrorListener() {
                    public void onErrorResponse(VolleyError error) {
                        Log.e("Image Error", error.getMessage());
//                        mImageView.setImageResource(R.drawable.image_load_error);
                    }
                });
// Access the RequestQueue through your singleton class.
        Volley.newRequestQueue(getApplicationContext()).add(request);
    }

gradle 中的库:

  compile 'com.mcxiaoke.volley:library:1.0.19'

以及 Manifest.xml

中的互联网权限
 <uses-permission android:name="android.permission.INTERNET" />

请尝试使用此代码。

谢谢。

连同我上面对你的问题的评论,你可以在 BasicNetwork.java:

中找到更多信息
...
               } catch (IOException e) {
                    int statusCode = 0;
                    NetworkResponse networkResponse = null;
                    if (httpResponse != null) {
                        statusCode = httpResponse.getStatusLine().getStatusCode();
                    } else {
                        throw new NoConnectionError(e);
                    }
                    VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl());
                    if (responseContents != null) {
                        networkResponse = new NetworkResponse(statusCode, responseContents,
                                responseHeaders, false, SystemClock.elapsedRealtime() - requestStart);
                        if (statusCode == HttpStatus.SC_UNAUTHORIZED ||
                                statusCode == HttpStatus.SC_FORBIDDEN) {
                            attemptRetryOnException("auth",
                                    request, new AuthFailureError(networkResponse));
                        } else {
                            // TODO: Only throw ServerError for 5xx status codes.
                            throw new ServerError(networkResponse);
                        }
                    } else {
                        throw new NetworkError(networkResponse);
                    }
                }

如果响应代码是 403 - FORBIDDEN,将调用 attemptRetryOnException() 并获取图像。

希望对您有所帮助!

这不是 VolleyImageLoader 的错误。

实际上我正在尝试直接使用存储桶 url 访问 amazon s3 存储桶的图像。

虽然图像在 url 处不存在,但当用户无权访问图像时,S3 returns 会返回 403 而不是 404。

Solved by this answer, check it for more details