微服务请求第三方服务实现
系统业务免不了与第三方公司进行交互,需要远程调用,RestTemplate到底是什么玩意?
RestTemplate
是Spring提供的用于访问Rest
服务的客户端工具,它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
弱弱呼吁一句:对于那些在Spring
环境下还在使用HttpClient
(或其它Client)的同学,今儿看完本文后,建议切换到RestTemplate
(有特殊需求的当然除外喽~)。
RestTemplate
简化了与http服务的通信,程序代码可以给它提供URL,并提取结果。它默认使用的JDK 的HttpURLConnection
进行通信,然而我们是可以通过RestTemplate.setRequestFactory
切换到不同的HTTP源:如Apache HttpComponents
、Netty
、OkHttp
等等。
关于响应:
xxxForObject:返回响应体(也就直接是body体力的内容) (T)
xxxForEntity:返回的相应行、响应头、响应码、响应体等等 (ResponseEntity<T>)
xxxForLocation:提交成功之后,返回新资源的URI。这个只需要服务提供者返回一个 URI 即可,该 URI 表示新资源的位置,可谓非常轻量。 (URI)
注意:使用字符串类型的url默认会对url进行转义,如http://example.com/hotel list
在执行时会转义为http://example.com/hotel%20list
,隐式的转义这样是没有问题的。但如果你自己已经转义过了,那就不ok了。
若不想要这种隐式的转义,建议使用URI(URI uri = uriComponents.toUri()
)来构造。
请求方式、载体、编码等都需要注意
public class RestTemplateUtil {private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateUtil.class);/*** RestTemplate 工具方法* @param url* @param object* @return*/public static String postRestTemplate(String url, Map<String,Object> object){SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();httpRequestFactory.setReadTimeout(35000);httpRequestFactory.setConnectTimeout(5000);List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();List<MediaType> supportedMediaTypes = new ArrayList<>();supportedMediaTypes.add(MediaType.APPLICATION_JSON);supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);supportedMediaTypes.add(MediaType.APPLICATION_PDF);supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);supportedMediaTypes.add(MediaType.APPLICATION_XML);supportedMediaTypes.add(MediaType.IMAGE_GIF);supportedMediaTypes.add(MediaType.IMAGE_JPEG);supportedMediaTypes.add(MediaType.IMAGE_PNG);supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);supportedMediaTypes.add(MediaType.TEXT_HTML);supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);supportedMediaTypes.add(MediaType.TEXT_PLAIN);supportedMediaTypes.add(MediaType.TEXT_XML);fastConverter.setSupportedMediaTypes(supportedMediaTypes);FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);fastConverter.setFastJsonConfig(fastJsonConfig);messageConverters.add(fastConverter);RestTemplate restTemplate = new RestTemplate(httpRequestFactory);restTemplate.setMessageConverters(messageConverters);LOGGER.info("请求地址"+url);LOGGER.info("入参"+ JSON.toJSONString(object));String s = restTemplate.postForObject(url, object, String.class);LOGGER.info(url+"出参" + s);return s;}/*** RestTemplate 工具方法* @param url* @param object* @return*/public static String postRestTemplate(String url, Map<String,Object> object,Map<String, String> headers){RestTemplate restTemplate = getRestTemplate();HttpHeaders httpHeaders = new HttpHeaders();if (Objects.nonNull(headers)) {headers.forEach((key, value) -> {httpHeaders.add(key, value);});}HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<Map<String, Object>>(object, httpHeaders);LOGGER.info("请求地址"+url+"Header"+JSON.toJSONString(object));LOGGER.info("请求地址"+url);LOGGER.info("入参"+ JSON.toJSONString(httpEntity));String s = restTemplate.postForObject(url, httpEntity, String.class);LOGGER.info("出参" + s);return s;}/*** RestTemplate 工具方法* @param url* @param object* @return*/public static String postRestTemplate(String url, Map<String,Object> object,Map<String, String> headers,SmpSendLogBO reqBO ){RestTemplate restTemplate = getRestTemplate();HttpHeaders httpHeaders = new HttpHeaders();if (Objects.nonNull(headers)) {headers.forEach((key, value) -> {httpHeaders.add(key, value);});}HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<Map<String, Object>>(object, httpHeaders);LOGGER.info("请求地址"+url+" Header"+JSON.toJSONString(object));reqBO.setSendData( new Gson().toJson(httpEntity));LOGGER.info("入参"+ new Gson().toJson(httpEntity));String s = restTemplate.postForObject(url, httpEntity, String.class);reqBO.setReceiveData(s);LOGGER.info("出参" + s);return s;}public static RestTemplate getRestTemplate() {SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();httpRequestFactory.setReadTimeout(35000);httpRequestFactory.setConnectTimeout(10000);List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();List<MediaType> supportedMediaTypes = new ArrayList<>();supportedMediaTypes.add(MediaType.APPLICATION_JSON);supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);supportedMediaTypes.add(MediaType.APPLICATION_PDF);supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);supportedMediaTypes.add(MediaType.APPLICATION_XML);supportedMediaTypes.add(MediaType.IMAGE_GIF);supportedMediaTypes.add(MediaType.IMAGE_JPEG);supportedMediaTypes.add(MediaType.IMAGE_PNG);supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);supportedMediaTypes.add(MediaType.TEXT_HTML);supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);supportedMediaTypes.add(MediaType.TEXT_PLAIN);supportedMediaTypes.add(MediaType.TEXT_XML);fastConverter.setSupportedMediaTypes(supportedMediaTypes);FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);fastConverter.setFastJsonConfig(fastJsonConfig);messageConverters.add(fastConverter);RestTemplate restTemplate = new RestTemplate(httpRequestFactory);restTemplate.setMessageConverters(messageConverters);return restTemplate;}
}
深入理解RestTemplatehttps://segmentfault.com/a/1190000020405004
微服务请求第三方服务实现相关推荐
- PhalAPI学习笔记 ——— 第二章接口服务请求
PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...
- .net中调用esb_大型ESB服务总线平台服务运行分析和监控预警实践
今天准备谈下ESB总线平台建设项目中的服务运行统计分析,服务心跳监测,服务监控预警方面的设计和实现.可以看到,在一个ESB服务总线平台上线后,SOA治理管控就变得相当重要,而这些运行监控分析本身也是提 ...
- 微服务 请求驱动和事件驱动_如何驯服事件驱动的微服务
微服务 请求驱动和事件驱动 现代微服务体系结构是事件驱动的,响应式的和编排的(与通过协调器进行集中控制相反). 这使得它们松散耦合并且易于更改. 对? TL; DR:不太容易! 您将在理解和管理事件流 ...
- 打通版微社区(4):微信第三方服务部署——JSP的IIS部署
写在前面: 本机环境2008R2.tomcat8 网上搜了很多JSP的IIS部署,内容大部分是相近的,这些文章最早出现在2012的样子.大概的原理就是通过ISAPI方式对IIS进行扩展(这个扩展是to ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...
- SpringCloud 微服务 (十五) 服务容错 Hystrix
2019独角兽企业重金招聘Python工程师标准>>> 壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直 ...
- 微服务架构的优缺点_微服务架构DNS服务注册与发现实现原理
微服务架构已经成为中小型企业必备的项目支撑能力,尤其互联网BATJ企业在04年已经非常成熟,在大规模的核心业务实战中总结了很多大规模服务调度与大数据集的处理方案.微服务架构中涉及到很多模块,本文以微服 ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】 1
前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...
- 微服务架构的服务与发现-Spring Cloud
https://www.jianshu.com/p/5eac16e9804a 作者:谦小易 链接:https://www.jianshu.com/p/5eac16e9804a 来源:简书 简书著作权归 ...
最新文章
- winrar压缩工具
- 在C#项目中使用SQLite(环境安装问题)
- 第十九期:HTTPS虐我千百遍,我却待她如初恋!
- 《Linux内核完全注释》《完全剖析》 » 阅读本书所需的基础知识 -- 再次强调。
- word中的表格空白部分整不掉,下面的表格拉不上来
- ASP.NET @Page指令属性
- 东北方言编程,程序员咋这么招人稀罕!
- eclipse项目build时,提示错误.
- cs231n_2020 作业knn笔记
- java dht 爬虫_P2P中DHT网络爬虫
- 王者荣耀同一微信号多个服务器,王者荣耀微信怎么切换账号?打不上省排?那就换个荣耀战区好了...
- python画兔子代码_Python基础练习实例11(兔子问题)
- 50个查询系列-第七个查询:查询学过“叶平”老师所教的所有课的同学的学号、姓名...
- CDN的加速域名、源站地址与回源host之间的关系
- 【Word】无分页符却出现异常分页情况
- 软考高项你想要的全在这
- 什么专业要学计算机思维导论,大学计算机:计算思维导论CAP
- Python | Python保存高维数组array,Python用pandas将numpy保存csv文件,Python保存3维数组
- Python批量下载ts视频文件,并用ffmpeg合并
- Canal的安装与使用(直接食用)--监控数据库binlog日志 实现实时操作