写在前面
最近笔者遇到了一个需求,笔者开发了一个视频提取小程序,由于微信小程序HTTPS的限制,在微信小程序上线后无法直接读取http的网络视频资源,此时需要通过HTTPS的接口请求后端服务器,然后后端执行HTTP转发,把视频资源返回到前端,下面是该功能的实现。
首先我们需要明确需求内容,微信小程序由于有服务器域名的限制,设置界面如下:
此时如果第三方资源是http的,则无法请求成功,需要转发,整个网络请求示意图如下图所示:
因此可以使用Java后台进行转发HTTP请求(因为Java应用所在的服务器,是通过HTTPS请求的)。
集成RestTemplate
集成RestTemplate的代码如下:
进行请求转发package cn.common.rest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* @author Singer create by singer - Singer email:singer-coder@qq.com
* @projectName multi-platform
* @Description:
* @date 2023-11-21
*/
public class RestTemplateConfig {
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setReadTimeout(5000);
return factory;
}
}
使用RestTemplate进行请求转发的代码如下:
public void downloadVideo(String fileUrl) throws Exception {
Long beginTime = System.currentTimeMillis();
log.info("<<<<<<<<<下载请求start:{}>>>>>>", beginTime);
log.info("download file:{}", fileUrl);
/*Map<String, String> uriVariables = new HashMap<>();
uriVariables.put("fileId", downloadUrl);*/
ResponseExtractor<Boolean> responseExtractor = clientHttpResponse -> {
// 设置响应头,直接用第三方文件服务的响应头
HttpHeaders headers = clientHttpResponse.getHeaders();
headers.forEach((key, value) -> response.setHeader(key, value.get(0)));
/*String fileType = FileTypeUtil.getType(clientHttpResponse.getBody());
log.info("<<<<<<<<<文件类型:{}>>>>>>",fileType);*/
// 收到响应输入流即时拷贝写出到响应输出流中: inputStream -> outputStream
IoUtil.copy(clientHttpResponse.getBody(), response.getOutputStream());
Long endTime = System.currentTimeMillis();
log.info("<<<<<<<<<下载耗时:{}>>>>>>", (beginTime - endTime));
return true;
};
Boolean execute = restTemplate.execute(fileUrl, HttpMethod.GET, null, responseExtractor, new HashMap<String, String>());
log.info("download file success?{}", execute);
Long endTime = System.currentTimeMillis();
log.info("<<<<<<<<<下载耗时:{}>>>>>>", (endTime - beginTime));
}