转载

Springboot集成restTemplate过程详解

一restTemplate简介

restTemplate底层是基于HttpURLConnection实现的restful风格的接口调用,类似于webservice,rpc远程调用,但其工作模式更加轻量级,方便于rest请求之间的调用,完成数据之间的交互,在springCloud之中也有一席之地。大致调用过程如下图

二restTemplate常用方法列表

forObeject跟forEntity有什么区别呢?主要的区别是forEntity的功能更加强大一些,其返回值是一个ResponseEntity,更加方便我们获得响应的body,head等信息。exchange方法和其他方法不同之处就是能自己定义的rest请求方式。

2.1 get请求方法预览

2.2 post方法请求预览

2.3put请求方法预览

2.4 delete请求方法预览

2.5exchange方法预览

三rest接口调用示例

restTemplate配置

首先本次示例采用的是springboot2.x以上版本,javaSE8;其次发布的服务端是同一台机子,服务端端口8090,客户端端口8080;类路径youku1327;在实际工作中最常用是get,post请求方式;restTemplate简单配置如下:

/**
 * @Author lsc
 * @Description <p> </p>
 * @Date 2019/10/14 11:40
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {

  // 配置 RestTemplate
  @Bean
  public RestTemplate restTemplate(ClientHttpRequestFactory factory){
    return new RestTemplate(factory);
  }

  @Bean
  public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
    // 创建一个 httpCilent 简单工厂
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    // 设置连接超时
    factory.setConnectTimeout(15000);
    // 设置读取超时
    factory.setReadTimeout(5000);
    return factory;
  }
}

3.1 get请求接口调用示例

服务费发布的端口

@GetMapping("user")
  public String getUser(){
    return "youku1327";
  }

  @GetMapping("user/{name}")
  public String getUserName(@PathVariable String name){
    return name;
  }

客户端调用

GET参数说明:

  • 第一个参数是url。
  • 第二个参数是返回值类型。
  • 第三个参数是uri地址路径变量。
/*
   * @Author lsc
   * @Description <p> 获得无参的get请求 </p>
   * @Date 2019/10/17 21:15
   * @Param []
   * @return void
   **/
  @Test
  public void testGETNoParams(){
    String result = restTemplate.getForObject("http://localhost:8090/youku1327/user", String.class);
    System.out.println(result);
  }
  /*
   * @Author lsc
   * @Description <p> URL带参 </p>
   * @Date 2019/10/18 13:49
   * @Param []
   * @return void
   **/
  @Test
  public void testGETParams(){
    // http://localhost:8090/youku1327/user/{1}
    String result = restTemplate.getForObject("http://localhost:8090/youku1327/user/{name}", String.class,"lsc");
    System.out.println(result);
  }

3.2 post请求示例

POST请求参数说明

第一个参数是url。第二个参数是请求参数。第三个参数是返回值类型。第三个参数是uri地址路径变量。

服务端发布接口

@PostMapping("provider")
  public ResponseEntity<String> addData(@RequestBody JSONObject jsonObject){
    String user = (String) jsonObject.get("user");
    return ResponseEntity.ok(user);
  }

客户端接口调用

/*
   * @Author lsc
   * @Description <p> post</p>
   * @Date 2019/10/18 23:23
   * @Param []
   * @return void
   **/
  @Test
  public void testPostMethod() throws MalformedURLException {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("user","youku1327");
    HttpHeaders httpHeaders = new HttpHeaders();
    // 设置请求类型
    httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
    // 封装参数和头信息
    HttpEntity<JSONObject> httpEntity = new HttpEntity(jsonObject,httpHeaders);
    String url = "http://localhost:8090/youku1327/provider";
    ResponseEntity<String> mapResponseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
    System.out.println(mapResponseEntity.getBody());
  }

3.3 put接口调用示例

PUT请求参数说明

第一个参数是url。第二个参数是请求参数。第三个参数是uri地址路径变量。

服务端发布接口

@PutMapping("provider/{id}")
  public ResponseEntity<JSONObject> updateData(@PathVariable Long id, @RequestBody JSONObject jsonObject){
    Object object = jsonObject.get("user");
    jsonObject.put("id",id);
    // {"id":1327,"user":"youku1327"}
    System.out.println(jsonObject);
    return ResponseEntity.ok(jsonObject);
  }

客户端接口调用

/*
   * @Author lsc
   * @Description <p> put</p>
   * @Date 2019/10/18 23:23
   * @Param
   * @return
   **/

  @Test
  public void testPutMethod() throws MalformedURLException {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("user","youku1327");
    HttpHeaders httpHeaders = new HttpHeaders();
    // 设置请求类型
    httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
    // 封装参数和头信息
    HttpEntity<JSONObject> httpEntity = new HttpEntity(jsonObject,httpHeaders);
    String url = "http://localhost:8090/youku1327/provider/{id}";
    restTemplate.put(url, httpEntity, 1327);
  }

3.4delete请求示例

DELETE请求参数说明

第一个参数是url第二个参数uri地址路径变量。

服务端发布接口

@DeleteMapping("provider/{id}")
  public ResponseEntity<String> delData(@PathVariable Long id){
    String result = "delete"+id+"success";
    // delete1327success
    System.out.println(result);
    return ResponseEntity.ok(result);
  }

客户端调用接口

/*
   * @Author lsc
   * @Description <p> delete</p>
   * @Date 2019/10/18 23:22
   * @Param []
   * @return void
   **/
  @Test
  public void testDelete(){
    String url = "http://localhost:8090/youku1327/provider/{id}";
    restTemplate.delete(url,1327);
  }

3.5 exchange

参数说明:

第一个参数是url。第二个参数是请求方式。第三个参数是请求实体。第四个参数是返回值类型。第五个参数是uri地址变量。

服务端发布接口

@GetMapping("user/{name}")
  public String getUserName(@PathVariable String name){
    return name;
  }

客户端调用接口

/*
   * @Author lsc
   * @Description <p> exchange</p>
   * @Date 2019/10/18 23:22
   * @Param []
   * @return void
   **/
  @Test
  public void testExchange(){
    String url = "http://localhost:8090/youku1327/user/{name}";
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    HttpEntity httpEntity = new HttpEntity(httpHeaders);
    ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class, "youku1327");
    System.out.println(exchange.getBody());
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间:2020-04-21

Spring Boot RestTemplate提交表单数据的三种方法

在REST接口的设计中,利用RestTemplate进行接口测试是种常见的方法,但在使用过程中,由于其方法参数众多,很多同学又混淆了表单提交与Payload提交方式的差别,而且接口设计与传统的浏览器使用的提交方式又有差异,经常出现各种各样的错误,如405错误,或者根本就得不到提交的数据,错误样例如下: Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 405 Metho

详解SpringBoot通过restTemplate实现消费服务

一.RestTemplate说明 RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率.前面的博客中http://www.jb51.net/article/132885.htm,已经使用Jersey客户端来实现了消费spring boot的Restful服务,接下来,我们使用RestTemplate来消费前面示例中的Restful服务,前面的示例: springboot整合H2内存

详解SpringBoot中RestTemplate的几种实现

RestTemplate的多种实现 使用JDK默认的http library 使用Apache提供的httpclient 使用Okhttp3 @Configuration public class RestConfig { @Bean public RestTemplate restTemplate(){ RestTemplate restTemplate = new RestTemplate(); return restTemplate; } @Bean("urlConnection"

Spring Boot使用RestTemplate消费REST服务的几个问题记录

我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调用内外部REST接口完成业务逻辑. 在Spring Boot中,调用REST Api常见的一般主要有两种方式,通过自带的RestTemplate或者自己开发http客户端工具实现服务调用. RestTemplate基本功能非常强大,不过某些特殊场景,我们可能还是更习惯用自己封装的工具类,比如上传文件至分布式文件系统.处理带证书的https请求等. 本文以RestTemplate来

SpringBoot RestTemplate 简单包装解析

RestTemplate设计是为了Spring更好的请求并解析Restful风格的接口返回值而设计的,通过这个类可以在请求接口时直接解析对应的类. 在SpringBoot中对这个类进行简单的包装,变成一个工具类来使用,这里用到的是getForEntity和postForEntity方法,具体包装的代码内容 如下: package cn.eangaie.demo.util; import com.alibaba.fastjson.JSONObject; import org.springframe

Springboot RestTemplate 简单使用解析

前言 spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可. 相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式.该类主要用到的函数有:exchange.getForEntity.postForEntity等.我主要用的是后面两个函数,来执行发送get跟post请求. 首先是RestTemplat

Spring boot2X Consul如何通过RestTemplate实现服务调用

这篇文章主要介绍了spring boot2X Consul如何通过RestTemplate实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Consul可以用于实现分布式系统的服务发现与配置 服务调用有两种方式: A.使用RestTemplate 进行服务调用 负载均衡--通过Ribbon注解RestTemplate B.使用Feign 进行声明式服务调用 负载均衡--默认使用Ribbon实现 先使用RestTemplate来实现 1

Spring boot2X Consul如何使用Feign实现服务调用

这篇文章主要介绍了spring boot2X Consul如何使用Feign实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 服务调用有两种方式: A.使用RestTemplate 进行服务调用 B.使用Feign 进行声明式服务调用 上一次写了使用RestTemplate的方式,这次使用Feign的方式实现 服务注册发现中心使用Consul 启动Consul consul agent -dev spring boot 版本 2.2.

spring cloud consul注册的服务报错critical的解决

测试spring cloud 使用consul注册服务的时候,出现critical,如下: 怎么解决这个问题,现在只能看到health check检查失败了. 受限调用这个请求Get http://consulIp:8500/v1/agent/checks,调完请求,就会拿到返回数据: { ...... "service:test-service-xx-xx-xx-xx": { "Node": "zookeeper-server1", "

spring cloud consul使用ip注册服务的方法示例

我测试spring cliud使用consul作为注册中心的时候,发现服务注册的时候,注册的都是hostname,比如: 注册了一个commonservice,在consul中是这样的: { "ID":"commonservice123", "address":"testcommonserver" ........ } 这肯定是不对的. 加入我有一个服务payservice需要调用commonservice,payservic

详解使用Spring Cloud Consul实现服务的注册和发现

首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm 项目规划,2个服务端,1个客户端 首先来看服务端, 一:服务端1: 项目依赖 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clou

详解Spring Cloud Consul 实现服务注册和发现

Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Sprin

Spring boot2X负载均衡和反向代理实现过程解析

Springboot集成restTemplate过程详解

这篇文章主要介绍了Spring boot2X负载均衡和反向代理实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 zuul 是netflix开源的一个API Gateway 服务器 所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序. 作为一个边界性质的应用程序,Zuul提供了动态路由.监控.弹性负载和安全功能. 实现反向代理 1.服务注册发现中心Consul 启动 consul agent -dev 2.服务端

spring cloud 使用Zuul 实现API网关服务问题

通过前面几次的分享,我们了解了微服务架构的几个核心设施,通过这些组件我们可以搭建简单的微服务架构系统.比如通过Spring Cloud Eureka搭建高可用的服务注册中心并实现服务的注册和发现: 通过Spring Cloud Ribbon或Feign进行负载均衡:通过Spring Cloud Hystrix进行服务容错保护以避免故障蔓延.微服务搭建好了之后我们肯定会提供给外部系统一些统一的RESTFul API服务接口进行调用, 但是当外部系统调用我们的RESTful API的时候,怎么确定它

SpringCloud实战之Feign声明式服务调用

在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻. 那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign. Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义

SpringCloud Feign 服务调用的实现

前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列--Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调用. Feign是一个声明性web服务客户端.它使编写web服务客户机变得更容易,本质上就是一个http,内部进行了封装而已. GitHub地址:https://github.com/OpenFeign/feign 官方文档:https://cloud.spring.io/spring-cloud-

原文  https://www.zhangshengrong.com/p/24NjoQGyXB/
正文到此结束
Loading...