这篇文章主要围绕如何使用RestTemplate转发大文件?和resttemplate发送文件展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何使用RestTemplate转发大文件?的优缺点,
这篇文章主要围绕如何使用RestTemplate转发大文件?和resttemplate发送文件展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何使用RestTemplate转发大文件?的优缺点,解答resttemplate发送文件的相关问题,同时也会为您带来java – 如何使用注释自动连接RestTemplate、java-使用RestTemplate解析本地JSON文件、java后端发送http请求使用RestTemplate、restTemplate 源码解析(一)构造 restTemplate 的 Bean 实例的实用方法。
本文目录一览:- 如何使用RestTemplate转发大文件?(resttemplate发送文件)
- java – 如何使用注释自动连接RestTemplate
- java-使用RestTemplate解析本地JSON文件
- java后端发送http请求使用RestTemplate
- restTemplate 源码解析(一)构造 restTemplate 的 Bean 实例
如何使用RestTemplate转发大文件?(resttemplate发送文件)
我有一个网络服务电话,可以通过该电话上传zip文件。然后将文件转发到另一个服务以进行存储,解压缩等。目前,文件已存储在文件系统中,然后构建了FileSystemResource。
Resource zipFile = new FileSystemResource(tempFile.getAbsolutePath());
我可以使用ByteStreamResource来节省时间(转发之前不需要在磁盘上保存文件),但是为此,我需要构建一个字节数组。如果文件很大,我将收到“
OutOfMemory:java堆空间”错误。
ByteArrayResource r = new ByteArrayResource(inputStream.getBytes());
使用RestTemplate转发文件而不会出现OutOfMemory错误的任何解决方案?
答案1
小编典典您可以使用execute
这种低级操作。在此代码段中,我使用了Commons
IO的copy
方法来复制输入流。您需要HttpMessageConverterExtractor
针对期望的响应类型自定义。
final InputStream fis = new FileInputStream(new File("c:\\autoexec.bat")); // or whateverfinal RequestCallback requestCallback = new RequestCallback() { @Override public void doWithRequest(final ClientHttpRequest request) throws IOException { request.getHeaders().add("Content-type", "application/octet-stream"); IOUtils.copy(fis, request.getBody()); }};final RestTemplate restTemplate = new RestTemplate();SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();requestFactory.setBufferRequestBody(false); restTemplate.setRequestFactory(requestFactory); final HttpMessageConverterExtractor<String> responseExtractor = new HttpMessageConverterExtractor<String>(String.class, restTemplate.getMessageConverters());restTemplate.execute("http://localhost:4000", HttpMethod.POST, requestCallback, responseExtractor);
(感谢巴兹(Baz)指出您需要致电setBufferRequestBody(false)
,否则将导致败笔)
java – 如何使用注释自动连接RestTemplate
嵌套异常是org.springframework.beans.factory.NoSuchBeanDeFinitionException:找不到依赖关系的类型为[org.springframework.web.client.RestTemplate]的符合条件的bean:至少有一个bean符合此依赖关系的自动连线候选.
在注释驱动的环境中使用Spring 4.
我的调度程序servlet配置如下:
<context:component-scan base-package="in.myproject" /> <mvc:default-servlet-handler /> <mvc:annotation-driven /> <bean id="restTemplate"/>
我正在尝试自动连接RestTemplate的课程如下:
@Service("httpService") public class HttpServiceImpl implements HttpService { @Autowired private RestTemplate restTemplate; @Override public void sendUserId(String userId){ MultiValueMap<String,String> map = new LinkedMultiValueMap<>(); map.add("userId",userId); map.add("secretKey","kbhyutu7576465duyfy"); restTemplate.postForObject("http://localhost:8081/api/user",map,null); } }
解决方法
@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
java-使用RestTemplate解析本地JSON文件
我想解析一个本地JSON文件,并使用RestTemplate将其编组为模型,但无法确定是否可行.
我正在尝试在使用RestTemplate与服务器同步的Android应用程序上预填充数据库.我想,为什么不使用RestTemplate而不是自己解析本地JSON?它是专为将JSON解析为模型而设计的.
但是…我无法从文档中得知是否有任何方法可以做到这一点.有一个MappingJacksonHttpMessageConverter类似乎可以将服务器的http响应转换为模型…但是有什么办法可以破解与本地文件一起使用的方法?我试过了,但一直走得越来越深,没有运气.
解决方法:
想通了.除了使用RestTemplate,您还可以直接使用Jackson.没有任何理由需要RestTemplate参与其中.非常简单
try {
ObjectMapper mapper = new ObjectMapper();
InputStream jsonFileStream = context.getAssets().open("categories.json");
Category[] categories = (Category[]) mapper.readValue(jsonFileStream, Category[].class);
Log.d(tag, "Found " + String.valueOf(categories.length) + " categories!!");
} catch (Exception e){
Log.e(tag, "Exception", e);
}
java后端发送http请求使用RestTemplate
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<SsoUrlPrm>result = restTemplate.getForEntity(requestPathUrl,SsoUrlPrm.class);
-
RestTemplate restTemplate = new RestTemplate();
-
ResponseEntity<SsoUrlPrm>result = restTemplate.getForEntity(requestPathUrl,SsoUrlPrm.class);
restTemplate 源码解析(一)构造 restTemplate 的 Bean 实例
所有文章
https://www.cnblogs.com/lay2017/p/11740855.html
正文
构造一个 restTemplate 的 Bean 实例很容易,只需这样配置
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
但我们希望更多得了解一个这个构造过程做了哪些事情。为此,我们需要去打开 restTemplate 这个黑盒子。
restTemplate 设计
先试着从 restTemplate 得类图上获得一些灵感,看看 spring 的作者是一个什么样的设计思路吧。
我们看到,简单的几个类和接口展示了标准的抽象设计。
HttpAccessor 是一个抽象类,它抽象的是一个 http 访问器的概念。这说明,RestTemplate 具备 http 方式请求响应的处理能力。再看 RestOperations,它是一个接口,抽象的是 restful 风格的操作方法,这意味着 RestTemplate 的操作风格将是 Restful 的。
http 访问器和 restful 风格操作做了一个分离。restTemplate 则是聚合了两者,既有 http 访问器的基础能力,又在这个基础之上构建了 restful 风格。设计者把 Restful 操作作为接口,其实从规范角度上,我们应该面向 RestOperations 接口使用它。但大多数人似乎都直接使用 RestTemplate,我们上面的代码示例也无意识地直接面向了 RestTemplate 这个实现类。
restTemplate 实例构造过程
接下来,我们再看看 new 一个 RestTemplate 对象做了哪些事情。
进入 RestTemplate 类的构造方法
private final List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
private UriTemplateHandler uriTemplateHandler;
public RestTemplate() {
// 添加HttpMessageConverterjie
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
this.messageConverters.add(new ResourceHttpMessageConverter(false));
try {
this.messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Error err) {
// Ignore when no TransformerFactory implementation is available
}
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
if (romePresent) {
this.messageConverters.add(new AtomFeedHttpMessageConverter());
this.messageConverters.add(new RssChannelHttpMessageConverter());
}
if (jackson2XmlPresent) {
this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
}
else if (jaxb2Present) {
this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jackson2Present) {
this.messageConverters.add(new MappingJackson2HttpMessageConverter());
}
else if (gsonPresent) {
this.messageConverters.add(new GsonHttpMessageConverter());
}
else if (jsonbPresent) {
this.messageConverters.add(new JsonbHttpMessageConverter());
}
if (jackson2SmilePresent) {
this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter());
}
if (jackson2CborPresent) {
this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());
}
// uri模板处理器
this.uriTemplateHandler = initUriTemplateHandler();
}
构造方法有点长,但只做了两件事
1)添加 HttpMessageConverter 的实现类,熟悉 springmvc 的话估计知道 HttpMessageConverter。顾名思义,它就是用来转换 http 请求响应过程中的消息数据的。
2)初始化一个 UriTemplateHandler
我们跟进 initUriTemplateHandler 方法,看看怎么初始化一个 uri 模板处理器的
private static DefaultUriBuilderFactory initUriTemplateHandler() {
DefaultUriBuilderFactory uriFactory = new DefaultUriBuilderFactory();
uriFactory.setEncodingMode(EncodingMode.URI_COMPONENT); // for backwards compatibility..
return uriFactory;
}
这里只是简单地构造了实例,并直接返回。由此可见,DefaultUriBuilderFactory 应该直接或者间接实现了 UriTemplateHandler
我们看看 DefaultUriBuilderFactory 的类图
与我们猜想的一样,DefaultUriBuilderFactory 间接实现了 UriTemplateHandler
RestTemplate 的构造方法中就做了这两件事,我们再看看 HttpAccessor
public abstract class HttpAccessor {
// ...
private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
// ...
}
默认创建了一个 ClientHttpRequestFactory 的实例,ClientHttpRequestFactory 这个接口是用来创建客户端的 request 请求对象的,我们并没有去自定义设置它默认采用 SimpleClientHttpRequestFactory 这个实现类。
ClientHttpRequestFactory 作为工厂模式,将会生产 ClientHttpRequest。ClientHttpRequest 抽象了 Http 请求操作,执行 ClientHttpRequest 将会发送请求与服务端交互。
总结
到这里,RestTemplate 的实例构造过程就结束了。其实它的原理就是封装了 http 请求操作而已。
我们再大体过一下 RestTemplate 的构造过程
1)在 RestTemplate 构造方法中添加了多个 HttpMessageConverter 后续用于 http 请求响应的数据转换
2)在 RestTemplate 构造方法中初始化了一个 Uri 模板的处理器,后续用于处理 uri 相关的东西
3)HttpAccessor 默认创建了一个 ClientHttpRequestFactory 的成员实例,后续用于创建请求对象。
不过,似乎最有学习价值的还是一开始的 restTemplate 的设计图。能够理解抽象类与接口的标准设计理念,兴许对面向对象分析与设计大有裨益。
今天关于如何使用RestTemplate转发大文件?和resttemplate发送文件的介绍到此结束,谢谢您的阅读,有关java – 如何使用注释自动连接RestTemplate、java-使用RestTemplate解析本地JSON文件、java后端发送http请求使用RestTemplate、restTemplate 源码解析(一)构造 restTemplate 的 Bean 实例等更多相关知识的信息可以在本站进行查询。
本文标签: