正常下载文件直接发送http请求,现在常用的工具包比如hutool可以直接
HttpUtil.downloadFile
但是如果返回的是302状态码,那么就下载失败了,302 就是重定向的状态码,代表这个资源需要你去自己重定向到另一个地址进行下载,这时候如果在地址栏,浏览器可以处理,如果是在自己处理的请求逻辑里面,就需要自己判断状态码了,然后取response返回的header的Location字段的值,需要重定向的地址会存放到这里,
这里提供一个使用hutool的跟随302的demo
void download(String fileUrl,String filePath){
HttpRequest request = cn.hutool.http.HttpUtil.createGet(fileUrl);
HttpResponse response = request.execute();
if(response.isOk()){
FileUtil.writeBytes(response.bodyBytes(),filePath);
}else {
int status = response.getStatus();
if(Objects.equals(status,302)){
// 重定向
String location = response.header("Location");
log.info("开始302重新请求:{}",location);
download(location,filePath);
}else {
log.error("请求失败:status:{},body:{}",response.getStatus(),response.body());
}
}
}
这样就是个简单的跟随302重定向的demo,防止服务端出现302死循环或者潜逃过多,也可以设置最多重定向几次,可以加变量进行控制
大意了
其实Hutool默认也是有的,默认开启了跟随302,不过最大重试次数是0,没赋值初始值,感觉这里给个初始值最好,比如给个3,这里也不需要自己处理302了,可以直接改为
void download(String fileUrl,String filePath){
HttpRequest request = cn.hutool.http.HttpUtil.createGet(fileUrl);
HttpResponse response = request.execute();
// 直接在这里设置跟随重定向就可以了
request.setFollowRedirects(true);
request.setMaxRedirectCount(5);
if(response.isOk()){
FileUtil.writeBytes(response.bodyBytes(),filePath);
}else {
log.error("请求失败:status:{},body:{}",response.getStatus(),response.body());
}
}
这样设置跟随重定向跳转就可以了,也实现了之前说的最多重定向几次,防止有些资源自己有bug