SpringBoot RestTemplate GET POST请求的实例讲解

一)RestTemplate简介

RestTemplate是HTTP客户端库提供了一个更高水平的API。主要用于Rest服务调用。

RestTemplate方法:

方法组 描述

getForObject


通过GET检索表示形式。


getForEntity


ResponseEntity通过使用GET 检索(即状态,标头和正文)。


headForHeaders


通过使用HEAD检索资源的所有标头。


postForLocation


通过使用POST创建新资源,并Location从响应中返回标头。


postForObject


通过使用POST创建新资源,并从响应中返回表示形式。


postForEntity


通过使用POST创建新资源,并从响应中返回表示形式。


put


通过使用PUT创建或更新资源。


patchForObject


通过使用PATCH更新资源,并从响应中返回表示形式。请注意,JDK HttpURLConnection不支持PATCH,但是Apache HttpComponents和其他支持。


delete


使用DELETE删除指定URI处的资源。


optionsForAllow


通过使用ALLOW检索资源的允许的HTTP方法。


exchange


前述方法的通用性强(且意见少的版本),在需要时提供了额外的灵活性。它接受RequestEntity(包括HTTP方法,URL,标头和正文作为输入)并返回ResponseEntity。

这些方法允许使用ParameterizedTypeReference而不是Class使用泛型来指定响应类型。


execute


执行请求的最通用方法,完全控制通过回调接口进行的请求准备和响应提取。

二)RestTemplate案例

第一步:创建一个maven项目,在pom.xml引入一个springboot的版本

pom.xml内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.oysept</groupId>
  <artifactId>spring_resttemplate</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/>
  </parent>

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

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>com.oysept.RestTemplateApplication</mainClass>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

application.yml配置:该配置就一个默认端口

server:

port: 8080

创建一个springboot启动类RestTemplateApplication

package com.oysept;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class RestTemplateApplication {

  public static void main(String[] args) {
    new SpringApplicationBuilder(RestTemplateApplication.class).run(args);
  }
}

到此步骤时,可以先运行RestTemplateApplication中的main方法,检验springboot启动是否正常。

第二步:创建一个RestTemplate配置类并注入,因为在使用时,不提前注入ResttTemplate,在通过@Autowired使用会报RestTemplate找不到

package com.oysept.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 注册一个RestTemplate Bean, 否则直接通过@Autowired使用会报RestTemplate找不到
 * @author ouyangjun
 */
@Configuration
public class RestTemplateConfig {

  /**
   * 方式一: 默认是使用JDK原生java.net.HttpURLConnection请求
   * @return
   */
  @Bean(name = "restTemplate")
  public RestTemplate restTemplate() {
    return new RestTemplate();
  }

  /**
   * 方式二: 使用apache http内置请求, 需要在pom.xml中引入相应的apache jar
   * 可以使用HttpClient,设置一些http连接池等信息
   * @return
   *
  @Bean(name = "restTemplate")
  public RestTemplate restTemplate() {
    return new RestTemplate(new HttpComponentsClientHttpRequestFactory());
  }
   */

  /**
   * 方式三: 使用OkHttp内置请求, 需要在pom.xml中引入相应的OkHttp3 jar
   * 可以使用OkHttpClient,设置一些http连接池信息
   * @return
   *
  @Bean(name = "restTemplate")
  public RestTemplate restTemplate() {
    return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
  }
  */
}

第三步:创建一个VO类,用于测试入参和出参

package com.oysept.vo;
public class MsgVO {
  private String msgKey;
  private String msgValue;

  public String getMsgKey() {return msgKey;}
  public void setMsgKey(String msgKey) {this.msgKey = msgKey;}

  public String getMsgValue() {return msgValue;}
  public void setMsgValue(String msgValue) {this.msgValue = msgValue;}

  public String toString() {
    return "MsgVO [msgKey: "+this.msgKey+", msgValue: "+this.msgValue+"]";
  }
}

第四步:创建一个服务端接口,用于测试

package com.oysept.controller;

import java.util.ArrayList;
import java.util.List;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.oysept.vo.MsgVO;

/**
 * 服务端, 提供接口被调用
 * @author ouyangjun
 */
@RestController
public class ServerController {

  // 无参GET请求: http://localhost:8080/server/get
  @RequestMapping(value = "/server/get", method = RequestMethod.GET)
  public String get() {
    return "/server/get";
  }

  // 带参GET请求: http://localhost:8080/server/get/param?param=111222333444
  @RequestMapping(value = "/server/get/param", method = RequestMethod.GET)
  public String getParam(@RequestParam(value = "param") String param) {
    return "/server/get/param," + param;
  }

  // 路径中带参GET请求: http://localhost:8080/server/get/url/AAAA/BBBB
  @RequestMapping(value = "/server/get/url/{one}/{two}", method = RequestMethod.GET)
  public String getUrl(@PathVariable("one") String one, @PathVariable("two") String two) {
    return "/get/url/{one}/{two}," + one + "," + two;
  }

  // 无参GET请求, 返回List: http://localhost:8080/server/get/list
  @RequestMapping(value = "/server/get/list", method = RequestMethod.GET)
  public List<Object> getList() {
    List<Object> list = new ArrayList<Object>();
    list.add(11);
    list.add("AA");
    return list;
  }

  // 无参GET请求, 返回对象: http://localhost:8080/server/get/MsgVO
  @RequestMapping(value = "/server/get/MsgVO", method = RequestMethod.GET)
  public MsgVO getMsgVO() {
    MsgVO vo = new MsgVO();
    vo.setMsgKey("keyAAA");
    vo.setMsgValue("valueBBB");
    return vo;
  }

  // POST请求, 表单参数, application/x-www-form-urlencoded
  @RequestMapping(value = "/server/post/form", method = RequestMethod.POST,
    consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  public MsgVO postForm(MsgVO msgVO) {
    System.out.println("msgKey: " + msgVO.getMsgKey() + ", msgValue: " + msgVO.getMsgValue());
    return msgVO;
  }

  // POST请求, JSON参数, application/json
  @RequestMapping(value = "/server/post/json", method = RequestMethod.POST,
      consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
      produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  public MsgVO postJson(@RequestBody MsgVO msgVO) {
    System.out.println("msgKey: " + msgVO.getMsgKey() + ", msgValue: " + msgVO.getMsgValue());
    return msgVO;
  }
}

第五步:创建一个测试服务端接口的API

import的类和注入的RestTemplate:

package com.oysept.controller;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import com.oysept.vo.MsgVO;

/**
 * 客户端, 调用服务端提供的接口
 * @author ouyangjun
 */
@RestController
public class ClientController {

  // 使用默认请求方式
  @Autowired
  @Qualifier(value = "restTemplate")
  private RestTemplate restTemplate;

  // 在此处添加客户端测试代码
}

1、GET请求

// 直接在浏览中输入访问地址: http://localhost:8080/client/get
@RequestMapping(value = "/client/get", method = RequestMethod.GET)
public String get() {
  // 无参GET请求
  String get = restTemplate.getForObject("http://localhost:8080/server/get", String.class);
  System.out.println("==>/server/get return: " + get);

  // 带参GET请求
  String getParam = restTemplate.getForObject("http://localhost:8080/server/get/param?param=111222333444", String.class);
  System.out.println("==>/server/get/param return: " + getParam);

  // 带参GET url请求
  String getUrlParam = restTemplate.getForObject("http://localhost:8080/server/get/url/{one}/{two}", String.class, "AAAA", "BBBB");
  System.out.println("==>/server/get/url/{one}/{two} return: " + getUrlParam);

  // 带参GET url请求
  Map<String, String> vars = new HashMap<String, String>();
  vars.put("one", "HHHH");
  vars.put("two", "EEEE");
  String getUrlVars = restTemplate.getForObject("http://localhost:8080/server/get/url/{one}/{two}", String.class, vars);
  System.out.println("==>/server/get/url/{one}/{two} return: " + getUrlVars);

  // 无参GET请求, 返回List
  @SuppressWarnings("unchecked")
  List<String> getList = restTemplate.getForObject("http://localhost:8080/server/get/list", List.class);
  System.out.println("==>/server/get/list return: " + getList);

  // GET请求, 返回对象
  ResponseEntity<MsgVO> entity = restTemplate.getForEntity("http://localhost:8080/server/get/MsgVO", MsgVO.class);
  System.out.println("==>/server/get/list return: " + entity.getBody());
  return "GET SUCCESS";
}

2、GET url中传参请求

// 直接在浏览中输入访问地址: http://localhost:8080/client/get/request
// GET请求, url参数, 在表头中添加参数
@RequestMapping(value = "/client/get/request", method = RequestMethod.GET)
public String getRequest() {
  // url中参数
  Map<String, String> vars = new HashMap<String, String>();
  vars.put("one", "HHHH");
  vars.put("two", "EEEE");

  // 请求地址
  String uriTemplate = "http://localhost:8080/server/get/url/{one}/{two}";
  // 给URL地址encode转码
  URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(vars).toUri();
  // GET请求参数
  RequestEntity<Void> requestEntity =
        RequestEntity.get(uri)
        .header("MyHeader", "aaabbbcccddd")
        .build();
  // 响应
  ResponseEntity<String> response = restTemplate.exchange(requestEntity, String.class);
  // 结果
  System.out.println("==>/get/request header: " + response.getHeaders().getFirst("MyHeader"));
  System.out.println("==>/get/request body: " + response.getBody());
  return "POST SUCCESS";
}

3、POST application/x-www-form-urlencoded表单传参请求

// 直接在浏览中输入访问地址: http://localhost:8080/client/postForm
// POST请求, form表单入参
@RequestMapping(value = "/client/postForm", method = RequestMethod.GET)
public String postForm() {
  // uri
  String uriTemplate = "http://localhost:8080/server/post/form";

  // 设置请求头为form形式: application/x-www-form-urlencoded
  HttpHeaders headers = new HttpHeaders();
  headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

  // 设置参数, 和MsgVO中变量名对应
  MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
  map.add("msgKey", "1234");
  map.add("msgValue", "TestTest");

  // 封装请求参数
  HttpEntity<MultiValueMap<String, String>> requestb = new HttpEntity<MultiValueMap<String, String>>(map,
  headers);
  ResponseEntity<String> response = restTemplate.postForEntity(uriTemplate, requestb, String.class);
  System.out.println("==>/server/post/form return: " + response.getBody());
  return "POST SUCCESS";
}

4、POST application/json JSON传参请求

// 直接在浏览中输入访问地址: http://localhost:8080/client/postJson
// POST请求, JSON入参
@RequestMapping(value = "/client/postJson", method = RequestMethod.GET)
public String postJson() {
  // json入参
  MsgVO vo = new MsgVO();
  vo.setMsgKey("TTT");
  vo.setMsgValue("KKK");

  String uriTemplate = "http://localhost:8080/server/post/json";
  URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand().toUri();

  RequestEntity<MsgVO> requestEntity =
      RequestEntity.post(uri)
      .header("Content-Type", "application/json; charset=UTF-8")
      .body(vo);

  ResponseEntity<MsgVO> response = restTemplate.exchange(requestEntity, MsgVO.class);
  System.out.println("==>/server/post/json return: " + response.getBody());
  return "POST SUCCESS";
}

项目结构图:

以上这篇SpringBoot RestTemplate GET POST请求的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java 调用Restful API接口的几种方式(HTTPS)

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful API接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块front end 和back end,front end提供前台展示,back

  • JAVA发送http get/post请求,调用http接口、方法详解

    三个例子 -JAVA发送http get/post请求,调用http接口.方法 例1:使用 HttpClient (commons-httpclient-3.0.jar jar下载地址:http://xiazai.jb51.net/201904/yuanma/commons-httpclient-3.0.rar import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOE

  • Java如何实现URL带请求参数(get/post)及得到get和post请求url和参数列表的方法

    具体代码如下所示: public static String sendGet(String url,String param) { String result = ""; try{ String urlName = url + "?"+param;// URL U = new URL(urlName); URLConnection connection = U.openConnection(); connection.connect(); BufferedReade

  • 详解SpringBoot Controller接收参数的几种常用方式

    第一类:请求路径参数 1.@PathVariable 获取路径参数.即url/{id}这种形式. 2.@RequestParam 获取查询参数.即url?name=这种形式 例子 GET http://localhost:8080/demo/123?name=suki_rong 对应的java代码: @GetMapping("/demo/{id}") public void demo(@PathVariable(name = "id") String id, @Re

  • SpringBoot RestTemplate GET POST请求的实例讲解

    一)RestTemplate简介 RestTemplate是HTTP客户端库提供了一个更高水平的API.主要用于Rest服务调用. RestTemplate方法: 方法组 描述 getForObject 通过GET检索表示形式. getForEntity ResponseEntity通过使用GET 检索(即状态,标头和正文). headForHeaders 通过使用HEAD检索资源的所有标头. postForLocation 通过使用POST创建新资源,并Location从响应中返回标头. po

  • SpringBoot接收参数使用的注解实例讲解

    目录 1.基本介绍 2.接收参数相关注解应用实例 @PathVariable 使用 @RequestHeader 使用 @RequestParam 使用 @CookieValue 使用 @RequestBody 使用 3.复杂参数 1.基本介绍 2.复杂参数应用实例 4.自定义对象参数-自动封装 1.基本介绍 2.自定义对象参数-应用实例 1.基本介绍 SpringBoot 接收客户端提交数据/参数会使用到相关注解 详 解 @PathVariable . @RequestHeader . @Mo

  • Ajax异步请求技术实例讲解

    AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX不是新的编程语言,而是一种使用现有标准的新方法.ajax是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. ajax是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换.ajax可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分

  • Angular服务Request异步请求的实例讲解

    首先这里我简单写个例子来方便您的理解 var request = { post: function() { var errorCallback = { error: function(f) { this.fun = f; }, fun: function(data) {} }; successCallback = { success: function(f) { return this.fun = f, console.log(this.fun), errorCallback; }, fun:

  • requests在python中发送请求的实例讲解

    当我们想给服务器发送一些请求时,可以选择requests库来实现.相较于其它库而言,这种库的使用还是非常适合新手使用的.本篇要讲的是requests.get请求方法,这里需要先对get请求时的一些参数进行学习,在掌握了基本的用法后,可以就下面的requests.get请求实例进一步的探究. 1.get请求的部分参数 (1) url(请求的url地址,必需 ) import requests url="http://www.baidu.com" resp=requests.get(url

  • 实例讲解spring boot 多线程

    Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非阻塞的,即异步的,所有我们在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务. 一.配置类 package com.cenobitor.taskxecutor.config; import org.springfr

  • Springboot实例讲解实现专业材料认证管理系统流程

    目录 一,项目简介 二,环境介绍 三,系统展示 四,核心代码展示 五,项目总结 一,项目简介 这是一个基于java的毕业设计项目,毕设课题为springboot框架的知识产权服务平台系统, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架jsp+springboot+mybatis, 知识产权服务平台系统采用mysql进行数据存储, 并基于mybatis进行了orm实体关系映射, 该知识产权服务平台系统系统通过模块化实现,支持多角色权限管理系统,

  • SpringBoot自定义转换器应用实例讲解

    目录 1.基本介绍 2.自定义类型转换器应用实例 1.需求说明 2.代码实现 3.注意事项及使用细节 1.基本介绍 SpringBoot 在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器 SpringBoot 也支持自定义转换器, 这个内置转换器在 debug 的时候, 可以看到, 提供了 124 个内置转换器. 看下源码 GenericConverter-ConvertiblePair 2.自定义类型转换器应用实例 1.需求说明 演示自定义转换器使用 2.代码实现 1.修改sr

  • AJAX跨域请求数据的四种方法(实例讲解)

    由于浏览器的同源策略 ajax请求不可以接收到请求响应回来的数据 请求数据需要调用浏览器的内置构造函数 XMLHttpRequest() 进行 实例对象 var xhr = new XMLHttpRequest(); 注意点 在IE8之前支持的 ActiveXobject("Microsoft.XMLHTTP");  记住要进行兼容处理哦  在这里我就不写了 通过该对象进行获取 获取数据的四种状态  xhr.readyState 该属性保存着请求数据的几种状态 1.xhr.open(请

  • HttpUtils 发送http请求工具类(实例讲解)

    废话不多说,直接上代码 import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFac

随机推荐