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()
并获取图像。
希望对您有所帮助!
这不是 Volley
或 ImageLoader
的错误。
实际上我正在尝试直接使用存储桶 url 访问 amazon s3 存储桶的图像。
虽然图像在 url 处不存在,但当用户无权访问图像时,S3 returns 会返回 403 而不是 404。
Solved by this answer, check it for more details
我在我的项目中使用 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()
并获取图像。
希望对您有所帮助!
这不是 Volley
或 ImageLoader
的错误。
实际上我正在尝试直接使用存储桶 url 访问 amazon s3 存储桶的图像。
虽然图像在 url 处不存在,但当用户无权访问图像时,S3 returns 会返回 403 而不是 404。
Solved by this answer, check it for more details