微信公众号开发,会拉取用户资料,其中有一个用户的头像链接,一旦当用户更换头像这个链接便会失效。
如果前期存储了这个链接,但是当用户更换头像,我们又没有重新获取用户资料来更新数据,则会显示失效图片:
利用chrome的开发者工具Network进行请求包对比无法查看和可以正常查看的头像链接。
失效:
正常:
对比请求后可以发现,最主要的差别就是输出请求头X-*部分。
其中失败的头像里面会有一个X-ErrNo请求头数据。
如此,我通过模拟请求,得到返回数据中的请求头数据中拥有X-ErrNo请求头,则表示这个头像是失效的。
/**
* 检测微信头像是否可用
* @param url
* @return
*/
public static boolean checkWeChatHeadImg(String url) throws Exception{
HttpURLConnection http = null;
try {
URL urlObj = new URL(url);
if(url.startsWith("https://")){
http = (HttpsURLConnection) urlObj.openConnection();
}else{
http = (HttpURLConnection) urlObj.openConnection();
}
http.setRequestMethod("GET");
http.setConnectTimeout(30 * 1000);
http.setReadTimeout(30 * 1000);
http.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36");
http.setDefaultUseCaches(false);
http.connect();
Map> resHeaders = http.getHeaderFields();
for (Map.Entry> entry : resHeaders.entrySet()) {
String name = entry.getKey();
if ("X-ErrNo".equalsIgnoreCase(name)) {
return false;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (http != null) {
http.disconnect();
}
}
return true;
}