RestTemplate调用POST和GET请求示例详解

目录
  • 正文
    • 一、POST请求调用
    • 二、GET请求调用
    • 三、Exchange调用

正文

在日常开发过程中,http接口不仅提供给前端调用,有的时候还需要提供给其他业务方调用,在后台调用http请求的时候,我们一般使用Http Client客户端调用,java常用的Http客户端有:

  • java原生的HttpURLConnection
  • Apache http client
  • OkHttp
  • RestTemplate

下面来详细介绍一下使用RestTemplate来调用Post和Get请求。

在RestTemplate中,对同一种请求方式,一般有两种调用方法:

  • xxForObject

    • 返回一个指定类型的对象,通常是响应体反序列化后的java对象
    • 只返回反序列化的java对象,没有额外的http相应信息,只知道请求是否成功。
  • xxForEntity
    • 返回的是一个ResponseEntity对象,其中包含完整的http响应信息(状态码、响应头、响应体)

一、POST请求调用

  • postForObject
/**
    String/URI url: 请求的URL路径
    request: 一般设置请求头和请求体
    responseType:请求完成之后返回的结果类型
    Map<String, ?>/Object... uriVariables: 用来拼接请求url,可以是Map<String, ?>类型或Object类型可变参数
**/
postForObject/postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables)
eg:
void fun() {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    HttpEntity<String> httpEntity = new HttpEntity<>(params, headers);
    // 注意,如果想要使用可变参数来拼接url,那这里的url一定要使用占位符{}替换,并且名称要和可变参数名称一样才能在运行时将占位符位置替换成传入动态参数【可变参数也可以不传,那么这里的url就不需要占位符拼接】
    String url = "http://www.sea.com?uid={uid}&username={username}";
    String uid = "123";
    String username = "sea";
    // 因为responseType用的是String类型,所以返回的是一个String类型字符串
    String result = restTemplate.postForObject(url, httpEntity, String.class, uid, username);
}
postForObject/postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables)
eg:
void fun() {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    HttpEntity<String> httpEntity = new HttpEntity<>(params, headers);
    // 注意,如果想要使用可变参数来拼接url,那这里的url一定要使用占位符{}替换,并且名称要和可变参数名称一样才能在运行时将占位符位置替换成传入动态参数
    String url = "http://www.sea.com?uid={uid}&username={username}";
    Map<String, Object> params = new HashMap<>();
    String uid = "123";
    String username = "sea";
    params.put("uid", uid);
    params.put("username", username)
    // 因为responseType用的是String类型,所以返回的是一个String类型字符串
    String result = restTemplate.postForObject(url, httpEntity, String.class, params);
}
postForObject/postForEntity(URI url, Object request, Class<T> responseType)
eg:
void fun() {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    HttpEntity<String> httpEntity = new HttpEntity<>(params, headers);
    String url = "http://www.sea.com";
    MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
    multiValueMap.put("uid", 123);
    multiValueMap.put("username", "sea");
    // 不再使用可变参数绑定url,直接传入绑定后的uri参数
    URI uri = UriComponentsBuilder.fromHttpUrl(url).queryParams(multiValueMap).build().encode().toUri();
    // 因为responseType用的是String类型,所以返回的是一个String类型字符串
    String result = restTemplate.postForObject(uri, httpEntity, String.class);
}
eg: xxforEntity()
void fun() {
    Map<String, Object> map = new HashMap<>();
    map.put("uid", 123);
    map.put("username", "sea");
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<HashMap<String, Object>> httpEntity = new HttpEntity<>(map, headers);
    String url = "http://www.sea.com";
    // 使用xxforEntity,返回的是一个ResponseEntity,里面包含了statusCode(状态码)、Headers(响应头)、body(响应体)
    ResponseEntity<String> responseEntity = restTemplate.postForEntity(uri, httpEntity, String.class);
}

二、GET请求调用

getForObject/getForEntity(String url, Class<T> responseType, Object... uriVariables)
getForObject/getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
getForObject/getForEntity(URI url, Class<T> responseType)
在get请求调用中,除了请求参数中少了Object request【请求头和请求体】,其他的参数和方法调用同上面post的方法调用是一样的

三、Exchange调用

exchange调用可以理解为是一个万能调用,不特定是post还是get类型调用,请求方式由调用者指定。 ps:如果在get请求中需要指定请求头和请求体,而getForXX又不支持方法又不支持设置请求头,此时可以改成用exchange方法来调用,自己往HttpEntity<?> requestEntity参数中设置请求头和体。

以上就是RestTemplate调用POST和GET请求示例详解的详细内容,更多关于RestTemplate调用POST GET的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot-RestTemplate实现调用第三方API的方式

    RestTemplate简介Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如 Android或者第三方服务商都是使用 RestTemplate 请求 restful 服务. 下面通过代码讲解下SpringBoot-RestTemplate实现调用第三方API的方法,内容如下所示: 1. RestTemplate的方式来调用别人的AP

  • Java Http请求方式之RestTemplate常用方法详解

    目录 引言 常见用法 简单Get\Post请求 Post提交常规表单 Post上传文件 配置项 请求添加Cookie\Header 配置请求工厂 超时.代理 配置拦截器.转换器,错误处理 错误重试(额外) SSL请求 基于RestTemplate一些工具 钉钉机器人通知 总结 引言 在开发中有时候经常需要一些Http请求,请求数据,下载内容,也有一些简单的分布式应用直接使用Http请求作为跨应用的交互协议. 在Java中有不同的Http请求方式,主要就是HttpURLConnection或者Ap

  • 工具类之关于RestTemplateUtil工具类的使用

    目录 工具类-RestTemplateUtil工具类 代码可直接复制使用 RestTemplate配置类和工具类 工具类-RestTemplateUtil工具类 代码可直接复制使用 配置RestTemplate import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http

  • RestTemplate响应中如何获取输入流InputStream

    目录 RestTemplate调用接口如何获取输入流 SpringRestTemplate解析 RESTful RestTemplate ​总结 RestTemplate调用接口如何获取输入流 由于项目需求,需要获取RestTemplate请求响应的输入流.如下: 首先需要获取一个RestTemplate实例: RestTemplate rest = new RestTemplate(); 一般的使用方式如下: String message = rest.getForObject(url, St

  • 详解Java中restTemplate的使用

    目录 1 提供get/post接口 1.1 Controller 1.2 Service 2 调用get/post接口 2.1 Controller 2.2 Service 本文介绍restTemplate基础用法. Java中get和post的用法请参考:一文带你搞懂Java中Get和Post的使用 1 提供get/post接口 1.1 Controller @RestController @RequestMapping("/homepage") public class MyCon

  • RestTemplate Get请求实现bean参数传递详解

    目录 项目场景 问题描述 原因分析 解决方案 项目场景 Spring 的 RestTemplate 是一个健壮的.流行的基于 Java 的 Http客户端. RestTemplate实现request param参数传送,如果如下所示,直接传一个map对象,调试之后是不会接收到参数的 Map<String,Object> param = new HashMap<String,Object>(); param.put("since",10); restTempla

  • python爬虫使用requests发送post请求示例详解

    简介 HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式.服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析.具体的编码方式包括: application/x-www-form-urlencoded 最常见post提交数据的方式,以form表单形式提交数据. application/json 以json串提交数据. multipart/form-data 一般使用来上传文件. 一. 以f

  • Go类型安全的HTTP请求示例详解

    目录 前言 Go 原生写法 httpc 实现 更多能力 前言 对 Gopher 来说,虽然我们基本都是在写代码让别人来请求,但是有时候,我们也需要去请求第三方提供的 RESTful 接口,这个时候,我们才能感受到前端同学拼接 HTTP 请求参数的痛苦. 比如,我们要发起类似这样一个请求,看起来很简单,实际写起来还是比较繁琐的. POST /articles/5/update?device=ios HTTP/1.1 Host: go-zero.dev Authorization: Bearer <

  • Vue3中如何使用异步请求示例详解

    目录 1.前言 2.快速开始 2.1.思路 2.2.安装&封装axios 2.3.设计接口 2.4.设计视图 2.5.最终效果 总结 1.前言 接上节,我们初步体验了layui-vue的用法.相比其他ui框架,layui-vue的数据结构显得不是非常友好,但是经过数据拼凑也是能够成功运行的. 今天我们就主要介绍下在实际开发中最常用到的前后端接口交互.因为大多数时候前端为了高性能,对于后端接口的调用都会采用异步的方式.那该如何在vue3中使用异步请求渲染页面呢? 2.快速开始 2.1.思路 预期:

  • c#调用arcgis地图rest服务示例详解(arcgis地图输出)

    1.使用步骤 1)构建请求网址 A.确定端点:每个GIS服务都有一个端点.例如,ArcGIS Server上Demographics文件夹下名为ESRI_Census_USA的一个地图服务sampleserver1.arcgisonline.com的端点为:http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer. B.确定操作:不同地理信息系统服务支持不同的

  • RxJava和Retrofit2的统一处理单个请求示例详解

    前言 RxJava和Retrofit2用了一段时间了,写个小例子,分享出来,有什么不对的地方还请大神在评论区指正. 什么是Retrofit2 官网是这么介绍的: Retrofit adapts a Java interface to HTTP calls by using annotations on the declared methods to define how requests are made. 我翻译的可能不准确,他的大概意思是说:Retrofit 是一个 java 接口类,以注解

  • 在Android环境下WebView中拦截所有请求并替换URL示例详解

    需求背景 接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个xxx=1的标志位. 例如 http://www.baidu.com 加上标志位就变成了 http://www.baidu.com?xxx=1 寻找解决方案 从 Android API 11 (3.0) 开始,WebView 开始在 WebViewClient 内提供了这样一条 API ,如下: public WebResourceResponse shouldInterceptRequest(Web

  • UE4 Unlua 调用异步蓝图节点AIMoveTo函数示例详解

    目录 引言 源码分析 Unlua代码实现 引言 异步蓝图节点:在蓝图节点的右上角有时钟图标. 注意:异步节点可以在EventGraph/Macros中使用,但是无法在蓝图函数中使用. AIMoveTo节点:实现AI自主寻路,且能异步回调执行成功或失败的委托函数,且返回移动结果枚举值. 源码分析 AIMoveTo 蓝图节点对应C++的基类为 UK2Node_AIMoveToUK2Node_AIMoveTo 继承至异步Task节点基类 UK2Node_BaseAsyncTask,并在构造函数中完成了

  • history保存列表页ajax请求的状态使用示例详解

    目录 问题 优化前代码 history history.pushState() window.onpopstate 问题2 问题 最近碰到两个问题: 从首页进入列表页之后,点击下一页的时候,使用ajax请求更新数据, 然后点击浏览器“后退”按钮就直接返回到首页,实际这里想要的效果是返回列表页上一页. 在列表页分页为2的页面进入详情页,然后点击“后退”按钮,返回的事列表页分页为1的页面.没法记住之前分页状态. 优化前代码 代码如下,在页数变化的时候,去异步请求数据,渲染页面. const curr

  • C#异步调用示例详解

    本文实例为大家分享了C#异步调用的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Threading.Tasks; namespace AsyncAppTest { ////异步调用示例详解 /// 第1步:定义委托:此委托的返回值.参数类型必须与要调用的异步方法一致: //

  • fetch网络请求封装示例详解

    export default ({ url, method = 'GET', data = null, }) => { // 请求配置 let options = { method } // data不为空时,它就是post请求 if (data) { options = { ...options, body: JSON.stringify(data), headers: { 'content-type': 'application/json' } } } return fetch(url, o

随机推荐