摘要: RestTemplate与REST资源交互的方法涵盖了HTTP请求方法,包括get, post, put, delete。

本文分享自华为云社区《Springboot RestTemplate 服务里发送HTTP请求及几种用法的介绍》,作者:gentle_zhou。

在微服务如此流行的当下,专门为某项功能开发模块作为另一项功能的构建块就变得异常重要。假设我们的服务A是调用某个API接口,服务B则专门用来校验用户是否有权限,那么知道如何在服务A发送http请求去调用服务B的接口就很必要。

如果刚好我们的项目是用Java开发的,那么RestTemplate就是我们需要的可以提供便捷访问远程Http服务方法的类。我们先去官网看下RestTemplate类是在哪个包下:

可以看到是在spring框架网页客户端下,官网对它的介绍:

"Synchronous client to perform HTTP requests, exposing a simple, template method API over underlying HTTP client libraries such as the JDK HttpURLConnection, Apache HttpComponents, and others.

The RestTemplate offers templates for common scenarios by HTTP method, in addition to the generalized exchange and execute methods that support of less frequent cases."

翻译过来就是同步客户端来执行HTTP请求,暴露一个简单的模板方法API给底层的HTTP客户端库比如JDK HttpURLConnection、Apache HttpComponents。

RestTemplate通过HTTP方法为常见的场景提供了模板,除此之外,还提供了通用的交换和执行方法来支持不太常见的情况。

【如何创建?】

因为RestTemplate是Spring的封装;我们先去pom.xml文件里引入springboot starter web依赖,内含spring-web-X.X.X.RELEASE.jar包:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

再去官网看看构建的介绍:

我们可以用官网给的这三种方式来创建RestTemplate。一般来说我们用第一种方式就可以了:

RestTemplate restTemplate = new RestTemplate();

在这个创建过程,RestTemplate默认使用HttpMessageConverter实例将HTTP消息转换成POJO(Plain Ordinary Java Object,即普通的没有使用Entity Beans的Java 对象)或则从POJO转换成HTTP消息。

RestTemplate与REST资源交互的方法涵盖了HTTP请求方法,包括get, post, put, delete。

【Get请求】

在RestTemplate里,有两种方式可以发送Get请求:

1.getForEntity(),发送HTTP GET请求,返回ResponseEntity包含相应体所映射成的对象。官方对该函数的解释如下:

首先是需要三个参数:url(要调用的服务的地址),返回值的类型和包含uri模板值的map 以及 最后会返回ResponseEntity<T>(是Spring对HTTP请求相应的封装,包含了几个重要的元素比如响应码,内容类型,内容长度和响应消息体)。

当然该函数的参数也可以是"url,返回值的类型,扩展模板的变量" / "url,返回值的类型"。

举个例子,我下面用的参数就是"url,返回值的类型,扩展模板的变量":

String accessToken = "fakeAT";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForEntity("http://127.0.0.1:8880/getUserInfoById?accessToken={at}",
String.class, accessToken).getBody();

getBody()可以得到ResponseEntity<T>里面的响应消息体。

2.getForObject(),发送HTTP GET请求,返回映射的对象。官方对该函数的解释如下:

该方法也是需要三个参数:url,返回值的类型和包含uri模板值的map 以及 最后会返回T。

当然该函数的参数也可以是"url,返回值的类型,扩展模板的变量" / "url,返回值的类型"。

最后返回的T 实际上是对上一种方法返回的值ResponseEntity<T>的进一步封装,返回的是响应消息体里面的内容。

【Post请求】

在RestTemplate里,有三种方式可以发送Post请求:

1.postForEntity(),发送HTTP POST请求,返回ResponseEntity包含相应体所映射成的对象。官方对该函数的解释如下:

首先是需要三个参数:url,需要POST上去的对象(可以是null) 和扩展模板的变量 以及 最后会返回ResponseEntity<T>。

当然该函数的参数也可以是"url,需要POST上去的对象(可以是null),响应消息的类型,包含uri模板值的map" / "url,需要POST上去的对象(可以是null),响应消息的类型"。

2.postForObject(),发送HTTP POST请求,返回映射的对象。官方对该函数的解释如下:

首先是需要三个参数:url,需要POST上去的对象(可以是null) 和扩展模板的变量 以及 最后会返回ResponseEntity<T>。

当然该函数的参数也可以是"url,需要POST上去的对象(可以是null),响应消息的类型,包含uri模板值的map" / "url,需要POST上去的对象(可以是null),响应消息的类型"。

3.postForLocation(),发送HTTP POST请求,返回的是URI(提交POST之后,新资源的URI链接)。官方对该函数的解释如下:

首先是需要三个参数:url,需要POST上去的对象(可以是null) 和扩展模板的变量 以及 最后会返回URL(提交POST之后,新资源的URI链接)。

当然该函数的参数也可以是"url,需要POST上去的对象(可以是null),响应消息的类型,包含uri模板值的map" / "url,需要POST上去的对象(可以是null)"。

【Put请求】

put和post作用类似,只是后一个请求会把前一个请求覆盖,所以会被用来更改资源,POST则是用来增加资源。

在RestTemplate里,有1种方式可以发送Put请求:

1.put(),发送HTTP PUT请求,是void函数不返回内容。官方对该函数的解释如下:

首先是需要三个参数:url,需要PUT上去的对象(可以是null) 和扩展模板的变量,最后不会返回什么。做的事就是更改需要PUT上去的对象至URL指定的资源。

当然该函数的参数也可以是"url,需要PUT上去的对象(可以是null),包含uri模板值的map" / "url,需要PUT上去的对象(可以是null)"。

【Delete请求】

在RestTemplate里,有1种方式可以发送Delete请求:

1.delete(),发送HTTP DELETE请求,是void函数不返回内容。官方对该函数的解释如下:

首先是需要2个参数:url和扩展模板的变量,最后不会返回什么。做的事就是直接删除URL指定的资源。

当然该函数的参数也可以是"url,包含uri模板值的map" / "url"。

【Exchange方法和Execute方法】

1.exchange(),在URL上执行特定的HTTP方法,返回从响应体中映射得到的包含对象的ResponseEntity。

该方法可以指定请求的HTTP类型。对指定的URI模板执行HTTP方法,把指定的请求实体写入请求,并返回ResponseEntity响应。

官方对该函数的解释如下:

首先是需要5个参数:url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型和扩展模板的变量 以及 最后会返回ResponseEntity<T>。

当然该函数的参数也可以是"url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型,包含uri模板值的map" / "URI格式的url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型" / "url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型-ParameterizedTypeReference<T>,扩展模板的变量" / "url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型-ParameterizedTypeReference<T>,包含uri模板值的map" / "URI格式的url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型-ParameterizedTypeReference<T>" / "需要写入请求的实体(头部和主体 或 头部 或 主体,不可以是null), 响应消息的类型" / "需要写入请求的实体(头部和主体 或 头部 或 主体,不可以是null), 响应消息的类型-ParameterizedTypeReference<T>"。

2.execute(),在URL上执行特定的HTTP方法,返回一个从相应体映射得到的对象。

该方法可以对指定的URI模板执行请求的HTTP方法,用RequestCallback准备请求,并用ResponseExtractor读取响应,最后返回一个arbitrary对象(这里有个困惑,不知道怎么翻译才准确;根据英文定义,“An arbitrary object has those properties common to the individual objects in its range”即一个对象具有其范围内各个对象所共有性质的属性;物以类聚的感觉)。

官方对该函数的解释如下:

首先是需要5个参数:url,指定的HTTP方法(比如POST, GET),功能性的接口RequestCallback(准备请求的对象;可以是null),从响应消息里提取返回值的对象(可以是null)和扩展模板的变量 以及 最后会返回T。

当然该函数的参数也可以是"url,指定的HTTP方法(比如POST, GET),功能性的接口RequestCallback(准备请求的对象;可以是null),从响应消息里提取返回值的对象(可以是null)和包含uri模板值的map" / "URI格式的url,指定的HTTP方法(比如POST, GET),功能性的接口RequestCallback(准备请求的对象;可以是null),从响应消息里提取返回值的对象(可以是null)"。

【需要注意的地方】

1.url里面要把http/https写上,不然会报错;浏览器地址会帮我们自动补全,这里url变量可不会了

2.解决中文乱码的问题:.setContentType(MediaType.APPLICATION_JSON_UTF8),针对HttpHeaders

3.getForEntity() 返回的是HttpEntity<String>,如果我们需要的是里面的内容,我们需要HttpEntity<String>.getBody()来获取里面的字符串 或则 直接就用getForObject()

4.URL是URI的一个子集。 在《HTTP权威指南》一书中,对于URI的定义是:统一资源标识符;对于URL的定义是:统一资源定位符。 二者的区别在于,URI表示请求服务器的路径,定义这么一个资源。 而URL同时说明要如何访问这个资源(http://)

5.一个arbitrary对象(这里有个困惑,不知道怎么翻译才准确;根据英文定义,“An arbitrary object has those properties common to the individual objects in its range”即一个对象具有其范围内各个对象所共有性质的属性;物以类聚的感觉。)。

【参考资料】

点击关注,第一时间了解华为云新鲜技术~

4种Springboot RestTemplate 服务里发送HTTP请求用法的更多相关文章

  1. HttpClient服务端发送http请求

    本来以为对跨域问题的处理已经比较熟练了.可以通过jsonp.document.domain+iframe.window.name.window.postMessage.服务器上设置代理页面来解决.但还 ...

  2. 服务端发送xml请求java代码示例

    /** * */ package com.autoyol.pay.cmb.core; import java.io.ByteArrayOutputStream; import java.io.IOEx ...

  3. jQuery表单 Ajax向PHP服务端发送文件请求并返回数据

    ImageAjaxUpLoad.htm <!DOCTYPE html> <head> <meta charset='utf-8'> <title>< ...

  4. Query通过Ajax向PHP服务端发送请求并返回JSON数据

    Query通过Ajax向PHP服务端发送请求并返回JSON数据 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据.本文将通过实例演示了jQuer ...

  5. jQuery通过Ajax向PHP服务端发送请求并返回JSON数据

    SON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教 ...

  6. python接口自动化(八)--发送post请求的接口(详解)

    简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了.答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统 ...

  7. RestTemplate工具类根据服务名发送请求

    要使用RestTemplate 根据服务名发送请求的话需要 使用  @LoadBalanced  这个注解,用了这个注解的RestTemplate就不用使用  ip 来请求了,首先要创建一个配置类 i ...

  8. 【Java SpringBoot】RestTemplate使用postForObject发送请求,接收String类型的response时中文乱码

    https://blog.csdn.net/qq_43758789/article/details/120576717 使用RestTemplate发送PostForObject的时候会出现乱码.这是 ...

  9. springboot 邮件服务

    springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...

  10. 我眼中的 Nginx(六):深入 Nginx/Openresty 服务里的 DNS 解析

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

随机推荐

  1. 一些 trick 和思考收获

    2023.1.7 P1117 优秀的拆分 对于一眼看上去只能直接求解的题可以设置一些节点变为求每个节点的贡献 *2023 7.24 补充:这个 trick 也被称为设置关键点,通常用于区间长度固定或是 ...

  2. 数据结构-线性表-双向链表(c++)

    与单循环链表类似,但析构函数需要注意 析构函数: 因为while循环的条件是p->next!=front,所以不能直接delete front: template<class T> ...

  3. 🔥🔥TCP协议:三次握手、四次挥手,你真的了解吗?

    什么是TCP网络分层 应⽤层 应用层是网络协议栈中的最顶层,主要负责应用程序之间的通信.其中一种常见的应用层协议是HTTP协议,它定义了应用程序之间如何传递报文. 传输层 传输层是为两台主机之间的应用 ...

  4. Python 既是解释型语言,也是编译型语言

    哈喽大家好,我是咸鱼 不知道有没有小伙伴跟我一样,刚开始学习 Python 的时候都听说过 Python 是一种解释型语言,因为它在运行的时候会逐行解释并执行,而 C++ 这种是编译型语言 不过我今天 ...

  5. 关于RS485通讯TVS器件选择的经验

    先说经验结论 如果你的RS485用于频繁热拔插, 比如作为手持终端使用, 且手持器与目标板非隔离, 那么使用6.8CA可能是更好的选择. 因为有热拔插会产生浪涌, 而且在非隔离的场合有些工业设备接地也 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (141)-- 算法导论12.1 1题

    一.用go语言,对于关键字集合(1,4,5,10,16,17,21),分别画出高度为 2.3.4.5和6的二又搜索树. 文心一言: 以下是用Go语言为给定的关键字集合(1, 4, 5, 10, 16, ...

  7. 【免费】小傅哥 DDD 开发小册

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 如果在面试的时候,面试官问你DDD是什么,你怎么解释?是不是感 ...

  8. RPN FPN ROIPooling

    RPN(Region Proposal Network)介绍---> 特点从backbone 生成的Feture Map中 用一个 3x3 的Conv卷积核 遍历FeatureMap的每个点然后 ...

  9. Winform 控件库 MaterialSkin.2 使用教程(鸿蒙字体版)

    ️MaterialSkin.2 控件库在之前的文章中已经介绍过了,就不啰嗦了 - > Winform 好看控件库推荐:MaterialSkin.2 ️官方库里使用的是 Google 的 Robo ...

  10. 开源 Serverless 框架 Laf 性能优化实践

    介绍 Laf 是一个完全开源的 Serverless 框架,Laf 的 Node.js 运行时容器 (以下简称为 Runtime) 是 Laf 的函数执行环境,依托于 Express.js 框架.采用 ...