RestTemplate的超全讲解(全)

2023-05-16

目录

  • 前言
  • 1. 简介
  • 2. http状态码
  • 3. get请求
  • 4. post请求
  • 5. Exchange

前言

主要介绍RestTemplate的原理以及使用等

1. 简介

常见的http客户端请求工具:

  • jdk HttpURLConnection
  • Apache HttpClient 比较常用
  • OkHttp 比较常用

RestTemplate是一个同步的web http客户端请求模板工具
是基于spring框架的底层的一个知识点

具体常用的方法如官网所示
RestTemplate官方文档

部分常用方法截图如下:
在这里插入图片描述
具体的构造方法如下:
在这里插入图片描述
RestTemplate默认是使用HttpURLConnection,可以通过构造方法替换底层的执行引擎,常见的引擎又HttpClient、Netty、OkHttp
如果要想替换直接如构造方法所示即可

//底层执行引擎
RestTemplate template=new RestTemplate();

//底层执行引擎ClientHttp
RestTemplate template=new RestTemplate(ClientHttpRequestFactory requestFactory);

2. http状态码

  1. 消息
    100 Continue 通知继续
    ▪ 101 Switching Protocols
    ▪ 102 Processing

  2. 成功
    200 OK
    ▪ 201 Created
    ▪ 202 Accepted
    ▪ 203 Non-Authoritative Information
    ▪ 204 No Content
    ▪ 205 Reset Content
    ▪ 206 Partial Content
    ▪ 207 Multi-Status

  3. 重定向
    ▪ 300 Multiple Choices
    301 Moved Permanently 永久迁移
    302 Move Temporarily 临时迁移
    ▪ 303 See Other
    ▪ 304 Not Modified
    ▪ 305 Use Proxy
    ▪ 306 Switch Proxy
    ▪ 307 Temporary Redirect

  4. 请求错误 (客户端异常)
    ▪ 400 Bad Request
    ▪ 401 Unauthorized
    ▪ 402 Payment Required
    ▪ 403 Forbidden
    404 Not Found
    ▪ 405 Method Not Allowed
    ▪ 406 Not Acceptable
    ▪ 407 Proxy Authentication Required
    ▪ 408 Request Timeout
    ▪ 409 Conflict
    ▪ 410 Gone
    ▪ 411 Length Required
    ▪ 412 Precondition Failed
    ▪ 413 Request Entity Too Large
    ▪ 414 Request-URI Too Long
    ▪ 415 Unsupported Media Type
    ▪ 416 Requested Range Not Satisfiable
    ▪ 417 Expectation Failed
    ▪ 418 I’m a teapot
    ▪ 421Misdirected Request
    ▪ 422 Unprocessable Entity
    ▪ 423 Locked
    ▪ 424 Failed Dependency
    ▪ 425 Too Early
    ▪ 426 Upgrade Required
    ▪ 449 Retry With
    ▪ 451 Unavailable For Legal Reasons

  5. 服务器错误
    ▪ 500 Internal Server Error
    ▪ 501 Not Implemented
    ▪ 502 Bad Gateway
    ▪ 503 Service Unavailable
    ▪ 504 Gateway Timeout
    ▪ 505 HTTP Version Not Supported
    ▪ 506 Variant Also Negotiates
    ▪ 507 Insufficient Storage
    ▪ 509 Bandwidth Limit Exceeded
    ▪ 510 Not Extended
    ▪ 600 Unparseable Response Headers

3. get请求

其业务逻辑层面如下所示

@RestController

public class UserController {
    
    @GetMapping("/addUser/{#userId}/{userName}")
    public UserDTO addUser(@PathVariable("userId") Long userId,
    						@PathVariable("userName") Long userName){
		UserDTO userDTO =new UserDTO();
		userDTO.setUserId(userId);
		userDTO.setUserName(userName);
        return UserDTO;
    }
}
  • getForObject():返回对象为响应体中数据转化成的对象,基本上可以理解为Json
public class RestController {

    @Resource
	RestTemplate restTemplate;
    
    private static final String url = "http://localhost:8080/addUser/8888/码农研究僧";

    @GetMapping("/getForObject")
    public Object getForObject(){
		Map<String ,Long >paramMap =new HashMap<>();
		UserDTO result ==restTemplate.getForObject(url,UserDTO.class,paramMap);
		//Map<String ,Long > result =restTemplate.getForObject(url,Map.class,paramMap);
		return result;
    }
}

之后访问页面http://localhost:8080/getForObject即可显示其信息

  • getForEntity():返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等

具体代码模块如下

 @GetMapping("/getForEntity")
  public Object getForEntity(){
	Map<String ,Long >paramMap =new HashMap<>();
	
	//ResponseEntity包装返回结果
	ResponseEntity <HashMap> responseEntity =restTemplate.getForEntity(url,HashMap.class,paramMap);
	
	//返回状态码包装类
	HttpStatus statusCode =responseEntity.getStatusCode();
	
	//返回状态码
	int StatusCodeValue=responseEntity.getStatusCodeValue();
	
	//http返回头
	HttpHeaders headers=responseEntity.getHeaders();
	
	//返回对应请求结果
	return responseEntity.getBody();

4. post请求

post与get的区别在于post的方法传参map必须是MultiValueMap

基本类型传参和实体类型传参

//http://localhost:8080/postFor0bject1
@GetMapping("/postForObject1")
public UserDT0 postForObject1 ( ) {
	//远程访问的Url UserDTO
	String url = "http://localhost:8080/addUser1";
	// Post方法必须使用MultiValueMap传参。//使用UserDTO传参也可以
	
	MultiValueMap<String0bject> paramMap = new LinkedMultiValueMap<>();
	paramMap.add ("userId", 1008L);
	paramMap.add ("userName ""巧克力");
	UserDT0 userDTO = restTemplate.postForObject(url,paramMap,UserDT0.class);
	return userDTO;
}

如果使用到@RequestMapping,用httpentity

@RequestMapping( value = "/addUser3" )
public UserDT0 addUser3(@RequestBody UserDT0 userDTO) {
	userDTo.setUserName(userDTo.getUserName() + " from RequestBody" );
	return userDTO;
}

//http://localhost:8888/postForObject2
@GetMapping("/postForObject2")
public UserDT0 postForObject2( ) {
	//申明一个请求头
	HttpHeaders headers = new HttpHeaders();
	//application/json
	headers.setContentType( MediaType .APPLICATION_JSON);//远程访问的Url UserDTO
	string url = "http://localhost:8080/addUser3";
	/**
		此处使用MultiValueMap会报错
		MultiValueMap<String,0bject> paramMap = new LinkedMultiValueMap<>( );
		paramMap.add("userId",100OL) ;
		paramMap.add("userName","fencaibc");*/
	//此处可以使用HashMap代替,但是会有警告
	
	UserDT0 userDTO = new UserDTO( );
	userDTO.setUserId( 1088L);
	userDT0.setUserName("课程");
	HttpEntity<UserDTO> entityParam new HttpEntity<UserDTO>(userDTO,headers) ;
	UserDT0 result = restTemplate.postFor0bject(url, entityParam,UserDTO.class);
	return result ;
}

其他类似

//http://localhost:8088/ postForEntity1@GetMapping( " / postForEntity1")
public UserDT0 postForEntity1( ) {
	string url = "http://localhost:8080/addUser1" ;
	
	MultiValueMap<String,object> paramMap = new LinkedMultiValueMap<>( );
	
	paramMap.add("userId", 100);
	paramMap.add("userName""课程");
	
	ResponseEntity<UserDT0> userDTOResponseEntity =restTemplate.postForEntity(url,paramMap,UserDTO.class) ;
	
	HttpStatus statusCode = userDTOResponseEntity.getStatusCode( );
	
	int statusCodeValue = userDTOResponseEntity.getStatusCodeValue( );
	
	HttpHeaders headers = userDTOResponseEntity. getHeaders( );
	
	return userDTOResponseEntity. getBody( );
}

5. Exchange

可以用get也可以用post

// http://localhost:8088/exchange@GetMapping("/ exchange" )
public UserDT0 exchange( ) {
	//访问的远程地址UserDTO
	String url= "http:// localhost:8080 addUser1" ;
	//传参使用MultiValueMap
	MultiValueMap<String0bject> paramMap = new LinkedMultiValueMap<>();
	paramMap.add("userId",100);
	paramMap.add("userName ""exchange" );
	//HttpEntity包装了传参
	HttpEntity<MultiValueMap> requestEntity = new HttpEntity<>(paramMap ) ;
	ResponseEntity<UserDTO> response =
	restTemplate.exchange(url,HttpMethod.POST,requestEntity,UserDT0.class) ;
	return response.getBody ( );
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RestTemplate的超全讲解(全) 的相关文章

随机推荐

  • ansible常用模块

    ansible常用模块 1 ansible常用模块使用详解2 ansible常用模块之ping3 ansible常用模块之command4 ansible常用模块之raw5 ansible常用模块之shell6 ansible常用模块之sc
  • ansible之playbook

    playbook 1 实施playbook1 1Ansible Playbook与临时命令1 2格式化Ansible Playbook1 3运行playbook1 4提高输出的详细程度1 5语法验证1 6执行空运行 2 实施多个play2
  • LAMP-手动架构部署

    1 lamp简介 有了前面学习的知识的铺垫 xff0c 今天可以来学习下第一个常用的web架构了 所谓lamp xff0c 其实就是由Linux 43 Apache 43 Mysql MariaDB 43 Php Perl Python的一
  • 华为云欧拉操作系统(OpenEuler)部署K8S集群

    华为云欧拉操作系统 xff08 OpenEuler xff09 部署K8S集群 需要提前准备好OpenEular操作系统虚拟机3台 xff0c 本文使用模板机创建 一 主机硬件要求 1 1 主机操作系统说明 序号操作系统及版本备注1open
  • 虚拟机centos关闭繁忙导致无法操作(已解决)

    虚拟机关闭提示虚拟机繁忙导致关闭失败的问题 最近复制了一台虚拟机 xff0c 但是在关闭的时候总是遇到关不上的问题 xff0c 虚拟机提示繁忙 xff0c 开关机和重启按钮一直是灰色图标 xff0c 不能点击 解决办法倒是找到了 xff0c
  • ubuntu桌面图标全部消失,快捷键也打不开终端解决办法

    前几天远程todesk连接实验室服务器过程中出现了ubuntu桌面图标全部消失的现象 按照C到的很多方法操作过都不行 奇怪的是快捷键终端也打不开 界面是下面这个样子的 xff1a 整个人束手无策 然后 xff01 解决方法就是 重启实验室的
  • Ubuntu系统进去之后黑屏是什么问题,及解决办法【最全】

    出现黑屏可能有多种原因 xff0c 以下是一些常见的解决方法 xff1a 1 检查电源线和视频连接线是否牢固 有时候连接线松动或者断开都可能导致黑屏 2 检查显卡驱动是否正确安装 如果显卡驱动没有正确安装 xff0c 可能会导致黑屏 你可以
  • 【在Ubuntu中安装Pycharm(Ubuntu22.04,Pycharm2022.3.3)】详细如何解压文件

    本文讲述了在Ubuntu中安装pycharm的具体步骤 准备环境 xff1a Ubuntu22 04 xff0c Pycharm2022 3 3 具体步骤 xff1a 1 首先下载pycharm xff1a Pycharm官方下载地址 我在
  • 算法—求x的平方根,只保留整数部分(Java)

    需求 给你一个非负整数 x xff0c 计算并返回 x 的 算术平方根 由于返回类型是整数 xff0c 结果只保留 整数部分 xff0c 小数部分将被 舍去 注意 xff1a 不允许使用任何内置指数函数和算符 xff0c 例如 pow x
  • Finding memory bugs with AddressSanitizer

    AddressSanitizer ASan is an instrumentation tool created by Google security researchers to identify memory access proble
  • Android编译出现Warning: Mapping new ns to old ns的解决方案

    出现场景 更新了Android Studio版本后 xff0c 运行项目就出现以下警告 Warning Mapping new ns http schemas android com repository android common 02
  • Maven详细配置(全)

    目录 前言 maven下载配置 配置文件的修改 前言 maven是一个jar包管理工具 可以管理多个jar包 Maven是一个项目管理工具 它包含了一个项目对象模型 Project Object Model 一组标准集合 一个项目生命周期
  • Tomcat:HTTP状态 404 - 未找到解决方法

    出现如下问题 HTTP状态 404 未找到 类型 状态报告 消息 请求的资源 ajax war exploded 不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示 Apache Tomcat 8 5 69 H
  • jdk动态代理(AOP)从入门到精通(全)

    目录 前言1 了解代理模式2 静态代理案例3 动态代理3 1 入门案例3 2 原理实现3 3 深层案例3 4 步骤流程 4 模板总结 前言 整篇文章的代码源码如下 代码源码 理解什么是动态代理以及动态代理能干什么 使用jdk的反射机制 xf
  • SpringBoot从入门到精通(全)

    目录 前言1 入门案例1 1 新建项目1 2 代码模板 2 配置详解2 1 核心配置文件properties2 2 核心配置文件yml yaml2 3 多环境核心配置文件properties2 4 多环境核心配置文件yml2 5 自定义配置
  • jdbc之问号占位符的详细分析

    目录 前言实战 前言 先写sql语句框架 一个问号代表一个占位符 xff0c 之后占位符接收一个值占位符不可使用双引号或者单引号获取占位符 xff0c 给占位符传值 xff0c 通过setString等方法 之所以要用问号占位符 xff0c
  • docker出现Error response from daemon: driver failed programming external connectivity on endpoint解决方法

    目录 1 问题所示 2 分析原理 3 问题解决 1 问题所示 出现了如下问题 即简单测试run命令 运行一个简易命令不加端口的tomcat docker run d P name tomcat01 tomcat docker span cl
  • java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

    目录 前言1 学习路线2 学习方法 前言 这篇文章主要总结我之前所学过的框架以及学习路线 从实打实的零基础到框架再到项目 之后实习工作 也在这篇博客中记录我的学习笔记 以及在笔记中遇到的配置安装 代码bug等错误 都从零开始摸索并且记录了下
  • Bootstrap从入门到精通(全)

    目录 前言1 下载安装2 布局容器和栅格网格系统2 1 布局容器2 2 栅格网格系统 3 常用样式4 表单4 1 控件4 2 布局 5 插件5 1 导航框5 2 下拉菜单 前言 在了解这篇文章的时候 需要提前知道这些知识点 可看我之前的文章
  • RestTemplate的超全讲解(全)

    目录 前言1 简介2 http状态码3 get请求4 post请求5 Exchange 前言 主要介绍RestTemplate的原理以及使用等 1 简介 常见的http客户端请求工具 xff1a jdk HttpURLConnectionA