前言
这两天帮忙同事看了一个问题,就是从第三方平台下载很痛压缩文件到本地,他搞了挺长时间没搞出来,为了项目的进度,就稍微花了点时间帮忙处理了一下,刚好很长时间没有做这种压缩文件的处理了,记录一下,凑足本月四篇保底文章,哈哈。
一、问题处理思路
做这个事情必须明确一下几点:
- 第三方提供相关文档描述没有。
- 确定第三方提供文档的完整性。
- 自身要有一定的辨识度能不能从第三方提供的文档考量文档的可行性。
- 确定服务器连接地址是否可以访问。
- 确定服务器文件下载路径。
- 确定合同下载参数,是否准确。
- 确定请求方式。
- 确定请求头信息。
- 确定返回头信息。
二、接口文档信息
三、文档信息分析
- 合同下载路径是明确的。
- 合同下载的ID也可以拿到。
- 分析请求头信息:x-qys-accesstoken、x-qys-signature、x-qys-timestamp,经沟通后还发现少了x-qys-nonce信息。
- 按照要求给头部信息赋值,头部信息不做过多解释,很基础的东西。
HttpHeaders headers = new HttpHeaders(); // http请求头
headers.add("x-qys-accesstoken", AppToken);
headers.add("x-qys-timestamp", String.valueOf(time));
headers.add("x-qys-nonce", String.valueOf(uuid));
headers.add("x-qys-signature", md5);
headers.add("accept", "*/*");
headers.add("connection", "Keep-Alive");
headers.add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
- 看返回信息发现返回的是附件,zip格式的。
- 这种格式的路径拼接完整在浏览器就可以直接下载。
- java后台接收的话接收的就是流Byte。
ResponseEntity<byte[]> response = restTemplate.exchange(
url,
HttpMethod.GET,
new HttpEntity<byte[]>(headers),
byte[].class);
四、下载Zip到本地
代码给的不是完整的,但是一眼也能看明白。
@Test
public void testZipUpload() throws IOException
{
String AppToken = "";
String AppSecret = "";
Date date = new Date();
long time = date.getTime();
UUID uuid = UUID.randomUUID();
String md5 = this.MD5(AppToken + AppSecret + time + uuid, "UTF-8");
String url = "http://ip:port/contract/download?contractId=";
RestTemplate restTemplate = RestTemplateUtil.getInstance();
HttpHeaders headers = new HttpHeaders(); // http请求头
headers.add("x-qys-accesstoken", AppToken);
headers.add("x-qys-timestamp", String.valueOf(time));
headers.add("x-qys-nonce", String.valueOf(uuid));
headers.add("x-qys-signature", md5);
headers.add("accept", "*/*");
headers.add("connection", "Keep-Alive");
headers.add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
ResponseEntity<byte[]> response = restTemplate.exchange(
url,
HttpMethod.GET,
new HttpEntity<byte[]>(headers),
byte[].class);
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] body = response.getBody();
inputStream = new ByteArrayInputStream(response.getBody());
File file = new File("C:\\Users\\ASUS\\Desktop\\文件.zip");
if (!file.exists())
{
file.createNewFile();
}
outputStream = new FileOutputStream(file);
int len = 0;
byte[] buf = new byte[1024];
while ((len = inputStream.read(buf, 0, 1024)) != -1)
{
outputStream.write(buf, 0, len);
}
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
总结
凑足四篇2020年最后一篇博客,哈哈。