Spring模拟HTTP请求——RestTemplate类使用的理解

本文介绍Spring框架中的RestTemplate类,演示如何通过该类发送POST请求,并解析响应数据。包括直接注入获取对象与使用无参构造方法创建实例两种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring模拟HTTP请求——RestTemplate类使用的理解
上一阶段wab项目由于需要跨系统访问,从同事之前写的代码中发现了RestTemplate类,才知道Spring已经对wab请求已经封装过了(我是不是落伍了),随后对RestTemplate类进行了一些测试研究(未深入,仅在使用层面上进行),现将我对RestTemplate类的理解写下来,方便别人及未来的我使用。

RestTemplate的声明:
 

    1、RestTemplate会在String启动时注册成bean所以第一种方式是直接注入获取RestTemplate对象:

       

@Autowired
RestTemplate restTemplate;


    2、 RestTemplate提供了无参构造方法,可以直接new

 RestTemplate restTemplate=new RestTemplate();


RestTemplate的使用:

 

    由于RestTemplate类的主要方法使用都大同小异,这里仅拿postForObject方法进行举例。

        postForObject方法是进行一次post请求返回一个任意对象(Spring会将返回值自动序列化),

        postForObject方法有3个及3个以上参数,但仅使用3个参数已经可以满足日常需要,

 

restTemplate.posForObject(String url地址,Object  传递参数,Class 返回值映射对象)


其中

 

url地址:必须为全限定地址如http://www.baidu.com/,

传递参数:必须使用 MultiValueMap对象(其实可以使用其他对象但有些对象是不会将参数请求进去比如Map,尚不清楚原理,如果有大神知道还请告知)

    MultiValueMap对象的泛型为<String,List>其他泛型使用都会报错。其他使用方式参考Map

返回值映射对象:可以使用Object,Map,String等,Spring强大的序列化映射机制会将返回文件映射成任何可以映射的类型

    当返回文件不能转换为返回值映射对象时会报序列化异常

返回值:返回值类型为返回值映射对象类型。

实例:

下面的实例为无条件转发并接收返回值的实例供参考:

 

    @RequestMapping("/{urls}")
    @ResponseBody
    public  Object metadataTable(@PathVariable("urls") String urls,@RequestParam MultiValueMap value) {
        StringBuilder url = new StringBuilder("http://www.baidu.com");
        System.out.println("请求url:"+url.toString());
        System.out.println("接收参数:"+value.toString());
        Object map =restTemplate.postForObject(url.toString(),value, Object.class);
        System.out.println("接收数据:"+map.toString());
        return map;
    }
//较为自定义的情况
	@RequestMapping({"/auth/**"})
	public ResponseEntity metadataTable(HttpServletRequest request,HttpEntity httpEntity,HttpMethod method) {
		StringBuilder url = new StringBuilder("http://127.0.0.1:9999");
		url.append(request.getServletPath());
		url.append('?').append(request.getQueryString());
		ResponseEntity map=restTemplate.exchange(url.toString(),method,httpEntity,byte[].class);
		return map;
	}

 

 

 

 

### 使用 RestTemplate 调用第三方 API #### 创建配置读取 Key 为了更好地管理外部接口所需的密钥其他敏感数据,建议创建专门的属性用于存储这些信息。例如,在天气预报API的应用场景下: ```java @Data @ConfigurationProperties(prefix = "weather") public class WeatherProp { /** * 调用接口key */ private String key; } ``` 此代码片段定义了一个名为 `WeatherProp` 的Java Bean, 它继承自 `BaseBean`, 并通过注解 `@ConfigurationProperties` 来加载前缀为 `weather` 的配置项[^2]。 #### 初始化 RestTemplate 实例 Spring Boot 自带了对 RestTemplate 的集成支持,因此无需额外引入依赖库即可直接使用它发起HTTP请求。可以通过自动装配的方式获取到已经由框架初始化好的实例对象: ```java @Autowired private RestTemplate restTemplate; ``` 对于更复杂的定制化需求,则可以自行构建并注册一个或多个具有特定功能特性的 RestTemplate bean 到 Spring 上下文中去[^1]。 #### 构建 URL 发送 HTTP 请求 当准备向目标服务器发出GET方法型的请求时,可以根据实际情况决定是否要传递路径变量(path variable) 或者查询参数(query parameter),下面给出的例子展示了如何组合URL以及设置必要的请求头信息来完成一次完整的调用过程: ```java // 获取应用上下文中的 weather.key 属性值作为认证凭证的一部分 String apiKey = weatherProp.getKey(); // 组合最终的目标地址字符串形式 (假设这里采用 GET 方式的 RESTful 风格设计) StringBuilder urlBuilder = new StringBuilder(); urlBuilder.append("http://api.weather.com/data/2.5/weather?"); if (!StringUtils.isEmpty(apiKey)) { urlBuilder.append(String.format("appid=%s", apiKey)); } // 发起同步阻塞模式下的网络IO操作,并期望得到 JSON 格式响应体内容被转换成 Java 对象的结果集 ResponseEntity<String> response = restTemplate.getForEntity(urlBuilder.toString(), String.class); System.out.println(response.getBody()); ``` 上述代码段实现了基于给定模板构造实际执行所需的具体资源定位符(URI), 同时利用内置工具函数辅助处理可能存在的空指针异常情况;最后借助于 getForEntity 方法实现简单的客户端行为模拟——即向指定位置提交带有适当参数编码后的完整链接,等待对方返回的数据再作进一步解析加工[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值