又拍云(Upyun)刷新CDN,云存储缓存 —JavaAPI
最近在使用又拍云,今天搞这个缓存刷新搞了一会,是我的粗心导致,下面就说下这个刷新 URL API
吧,
已经咨询过客服,已弃用的意思是不再维护了,还可以用。也确认了,刷新只有这一个 API。要不只有手动刷新了。
登陆 又拍云 后,手动刷新链接地址:https://console.upyun.com/purge/purge_url/
具体操作自己琢磨,没难度。下面看看官方描述的 API。
缓存刷新(已弃用)
当源站的资源发生变更后,可以调用该 API 接口告知又拍云刷新缓存,缓存更新后,用户访问时会获取到更新后的资源。
特别地,使用又拍云存储会在资源变更后,自动刷新缓存,省去使用自主源站缓存刷新这一步。
API 地址
http://purge.upyun.com/purge/
curl -X POST \
http://purge.upyun.com/purge/ \
-H "Authorization: <your_authorization>" \
-H "Date: <date>" \
-F purge=<url-list>
- 将需要刷新的文件 URL(以 http:// 开头) 以 \n 为间隔符连接
- 将第 1 步所得字符串、空间名、日期(GMT 格式)、经过 MD5 处理后的操作员密码用 & 拼接
- 将第 2 步所得字符串进行 MD5 编码处理,所得记为 sign,
- 最后,将空间名,操作员名和第 3 步所得的 sign 以如下格式作为请求头参数传递:
Authorization: UpYun <bucket-name>:<operator-name>:<sign>
响应状态
状态码 | 说明 |
---|---|
200 | json 格式的字符串{invalid_domain_of_url:不属于自己域名的 url 列表} |
401 | 无认证头部信息(Authorization)(提示信息:Need Authorization Header) |
401 | 无认证头部信息(Date)(提示信息:Need Date Header) |
401 | 操作员不存在(提示信息:User is not exists) |
401 | 空间名不存在(提示信息:Bucket is not exists) |
401 | 请求时间超出 30 分钟(提示信息:Date offset error) |
401 | 签名错误(提示信息:Sign error) |
406 | 每分钟刷新 URL 个数超过 600 限制 |
Java 操作又拍云刷新 URL
直接上代码了,这里要说明几个包,Http
是我自己封装的,还不成熟,暂时不对外开放。你直接用你自己的 http 请求,或者用 HttpPost
也可以,待会都会讲到。
import com.google.gson.Gson;
import com.sojson.common.utils.Http;
import org.apache.commons.lang.StringUtils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* UpYun 操作方法合集
*
*
*/
public class UpyunCDNUtils {
/**
* 缓存刷新
* @param urls
*/
public static void refresh(String ...urls){
String bucket = "空间名";
String password = "明文密码";
String userName = "操作员";
//GMT 格式的 date
String gmt = getGMTDate();
//把 url 数组,以 \n 间隔
String urlParms = StringUtils.join(urls, "\n");
//拼接签名sign
String sign = md5(new StringBuffer(urlParms)
.append("&").append(bucket)
.append("&").append(gmt)
.append("&").append(md5(password)).toString());
//构建 Authorization
String auth = new StringBuffer("UpYun ")
.append(bucket).append(":")
.append(userName).append(":")
.append(sign).toString();
//Authorization格式:UpYun <bucket-name>:<operator-name>:<sign>
Http http = Http.create("http://purge.upyun.com/purge/");
http.head("Expect","");
http.head("Date",gmt);
http.head("Authorization",auth);
http.body("purge", urlParms);
Http result = http.post()//post 请求
.requestCount(3)//重试3次
.timeout(1)//10秒超时,因为这个接口会经常超时
.send();//发送请求
//正常返回会返回{"invalid_domain_of_url":{}} ,并且 httpcode "status":200
System.out.println(new Gson().toJson(result.getResponse()));
}
public static void main(String[] args) {
refresh("https://www.sojson.com");
}
/**
* 字符串 MD5加密
* @param str
* @return
*/
public static String md5(String str) {
String result = "";
byte[] temp = null;
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
temp = md5.digest(str.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
for (int i = 0; i < temp.length; i++) {
result += Integer.toHexString((0x000000ff & temp[i]) | 0xffffff00).substring(6);
}
return result;
}
/**
* 获取 GMT 格式时间戳
* @return
*/
private static String getGMTDate() {
SimpleDateFormat df = new SimpleDateFormat(
"E, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
df.setTimeZone(TimeZone.getTimeZone("GMT"));
return df.format(new Date());
}
}
关键点就是拼接 Sign
的时候。
下面也给出一个完整的 Demo 链接:https://github.com/lvtongda/java-purge-sdk
如果还是不行,请与我交流。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/270.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。