77import com .qiniu .util .Auth ;
88import com .qiniu .util .Json ;
99import com .qiniu .util .StringMap ;
10+ import com .qiniu .util .StringUtils ;
1011
12+ import java .io .UnsupportedEncodingException ;
13+ import java .net .MalformedURLException ;
14+ import java .net .URL ;
15+ import java .net .URLEncoder ;
16+ import java .security .NoSuchAlgorithmException ;
1117import java .util .HashMap ;
1218
1319/**
@@ -29,10 +35,21 @@ private CdnManager(Auth auth, String server) {
2935 Constants .CONNECT_TIMEOUT , Constants .RESPONSE_TIMEOUT , Constants .WRITE_TIMEOUT );
3036 }
3137
38+ /**
39+ * 刷新链接列表,每次最多不可以超过100条链接
40+ *
41+ * @link http://developer.qiniu.com/article/fusion/api/refresh.html
42+ */
3243 public Response refreshUrls (String [] urls ) throws QiniuException {
3344 return refreshUrlsAndDirs (urls , null );
3445 }
3546
47+ /**
48+ * 刷新目录列表,每次最多不可以超过10个目录
49+ * 刷新目录需要额外开通权限,可以联系七牛技术支持处理
50+ *
51+ * @link http://developer.qiniu.com/article/fusion/api/refresh.html
52+ */
3653 public Response refreshDirs (String [] dirs ) throws QiniuException {
3754 return refreshUrlsAndDirs (null , dirs );
3855 }
@@ -50,4 +67,111 @@ public Response refreshUrlsAndDirs(String[] urls, String[] dirs) throws QiniuExc
5067 StringMap headers = auth .authorizationV2 (url , "POST" , body , Client .JsonMime );
5168 return client .post (url , body , headers , Client .JsonMime );
5269 }
70+
71+ /**
72+ * 预取文件链接,每次最多不可以超过100条
73+ *
74+ * @link http://developer.qiniu.com/article/fusion/api/prefetch.html
75+ */
76+ public Response prefetchUrls (String [] urls ) throws QiniuException {
77+ HashMap <String , String []> req = new HashMap <>();
78+ req .put ("urls" , urls );
79+ byte [] body = Json .encode (req ).getBytes (Constants .UTF_8 );
80+ String url = server + "/v2/tune/prefetch" ;
81+ StringMap headers = auth .authorizationV2 (url , "POST" , body , Client .JsonMime );
82+ return client .post (url , body , headers , Client .JsonMime );
83+ }
84+
85+ /**
86+ * 获取域名访问带宽数据
87+ *
88+ * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html
89+ */
90+ public Response getBandwidthData (String [] domains , String startDate , String endDate ,
91+ String granularity ) throws QiniuException {
92+ HashMap <String , String > req = new HashMap <>();
93+ req .put ("domains" , StringUtils .join (domains , ";" ));
94+ req .put ("startDate" , startDate );
95+ req .put ("endDate" , endDate );
96+ req .put ("granularity" , granularity );
97+
98+ byte [] body = Json .encode (req ).getBytes (Constants .UTF_8 );
99+ String url = server + "/v2/tune/bandwidth" ;
100+ StringMap headers = auth .authorizationV2 (url , "POST" , body , Client .JsonMime );
101+ return client .post (url , body , headers , Client .JsonMime );
102+ }
103+
104+ /**
105+ * 获取域名访问流量数据
106+ *
107+ * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html
108+ */
109+ public Response getFluxData (String [] domains , String startDate , String endDate ,
110+ String granularity ) throws QiniuException {
111+ HashMap <String , String > req = new HashMap <>();
112+ req .put ("domains" , StringUtils .join (domains , ";" ));
113+ req .put ("startDate" , startDate );
114+ req .put ("endDate" , endDate );
115+ req .put ("granularity" , granularity );
116+
117+ byte [] body = Json .encode (req ).getBytes (Constants .UTF_8 );
118+ String url = server + "/v2/tune/flux" ;
119+ StringMap headers = auth .authorizationV2 (url , "POST" , body , Client .JsonMime );
120+ return client .post (url , body , headers , Client .JsonMime );
121+ }
122+
123+ /**
124+ * 获取CDN域名访问日志的下载链接
125+ *
126+ * @link http://developer.qiniu.com/article/fusion/api/log.html
127+ */
128+ public Response getCdnLogList (String [] domains , String logDate ) throws QiniuException {
129+ HashMap <String , String > req = new HashMap <>();
130+ req .put ("domains" , StringUtils .join (domains , ";" ));
131+ req .put ("day" , logDate );
132+
133+ byte [] body = Json .encode (req ).getBytes (Constants .UTF_8 );
134+ String url = server + "/v2/tune/log/list" ;
135+ StringMap headers = auth .authorizationV2 (url , "POST" , body , Client .JsonMime );
136+ return client .post (url , body , headers , Client .JsonMime );
137+ }
138+
139+ /**
140+ * 构建标准的基于时间戳的防盗链
141+ *
142+ * @param host 自定义域名,例如 http://img.abc.com
143+ * @param fileName 待访问的原始文件名,必须是utf8编码,不需要进行urlencode
144+ * @param queryString 业务自身的查询参数,必须是utf8编码,不需要进行urlencode
145+ * @param encryptKey 时间戳防盗链的签名密钥,从七牛后台获取
146+ * @param deadline 链接的有效期时间戳,是以秒为单位的Unix时间戳
147+ * @return signedUrl 最终的带时间戳防盗链的url
148+ */
149+ public static String createStandardAntileechUrlBasedOnTimestamp (
150+ String host , String fileName , String queryString , String encryptKey , long deadline )
151+ throws UnsupportedEncodingException , MalformedURLException , NoSuchAlgorithmException {
152+ String urlToSign ;
153+ if (queryString .trim ().length () != 0 ) {
154+ urlToSign = String .format ("%s/%s?%s" , host , URLEncoder .encode (fileName , "utf-8" ),
155+ URLEncoder .encode (queryString , "utf-8" ));
156+ } else {
157+ urlToSign = String .format ("%s/%s" , host , URLEncoder .encode (fileName , "utf-8" ));
158+ }
159+
160+ URL urlObj = new URL (urlToSign );
161+ String path = urlObj .getPath ();
162+
163+ String expireHex = Long .toHexString (deadline );
164+
165+ String toSignStr = String .format ("%s%s%s" , encryptKey , path , expireHex );
166+ String signedStr = StringUtils .md5Lower (toSignStr );
167+
168+ String signedUrl ;
169+ if (urlObj .getQuery () != null ) {
170+ signedUrl = String .format ("%s&sign=%s&t=%s" , urlToSign , signedStr , expireHex );
171+ } else {
172+ signedUrl = String .format ("%s?sign=%s&t=%s" , urlToSign , signedStr , expireHex );
173+ }
174+
175+ return signedUrl ;
176+ }
53177}
0 commit comments