【笔记】SpringBoot项目发送请求

前言

SpringBoot项目发送Get或Post请求

以微信小程序后端获取openid为例

引入包

1
import org.springframework.web.client.RestTemplate;

定义一个实体类

  • 定义一个用于处理接收响应的实体类
  • 如果不定义,可以使用Map或Object类接收响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class WxToken {

private String openid; // 用户唯一标识
private String session_key; // 会话密钥
private String unionid;
private String errcode; // 错误码
private String errmsg; // 错误信息

public WxToken(String openid, String session_key, String unionid, String errcode, String errmsg) {
this.openid = openid;
this.session_key = session_key;
this.unionid = unionid;
this.errcode = errcode;
this.errmsg = errmsg;
}

}

发送请求并处理响应

没有参数

WxToken.class:指定接受响应的类,如果没有定义实体类,可以使用Object.class或者Map.class

1
2
3
4
5
6
// 直接定义请求地址
String url = "https://api.weixin.qq.com/sns/jscode2session";

// 通过RestTemplate发送请求
RestTemplate restTemplate = new RestTemplate();
WxToken wxToken = restTemplate.getForObject(url, WxToken.class);

地址后面传递参数

  • 只有Get请求可以使用这种方式
1
2
3
4
5
6
7
8
9
10
11
12
// 定义参数列表
String js_code = ""; // 从前端传过来的js_code
String appid = ""; // 写自己的小程序appid
String secret = ""; // 写自己的小程序secret
String grant_type = "authorization_code";

// 定义请求地址和参数列表
String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&grant_type="+grant_type+"&js_code="+js_code;

// 通过RestTemplate发送请求
RestTemplate restTemplate = new RestTemplate();
WxToken wxToken = restTemplate.getForObject(url, WxToken.class);

通过Map传递参数

1
2
3
4
5
6
7
8
9
10
11
12
13
// 定义参数列表
Map<String, Object> map = new HashMap();
map.put("js_code", ""); // 从前端传过来的js_code
map.put("appid", ""); // 写自己的小程序appid
map.put("secret", ""); // 写自己的小程序secret
map.put("grant_type", "authorization_code");

// 只定义请求地址
String url = "https://api.weixin.qq.com/sns/jscode2session";

// 通过RestTemplate发送请求同时传递参数
RestTemplate restTemplate = new RestTemplate();
WxToken wxToken = restTemplate.getForObject(url, WxToken.class, map);

通过自定义对象传递参数

  • 定义一个请求实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Paramter {

private String js_code; // 从前端传过来的js_code
private String appid; // 写自己的小程序appid
private String secret; // 写自己的小程序secret
private String grant_type;

public Paramter(String js_code, String appid, String secret, String grant_type) {
this.js_code = js_code;
this.appid = appid;
this.secret = secret;
this.grant_type = grant_type;
}

}
  • 发送请求并接收响应
1
2
3
4
5
6
7
8
9
// 定义参数列表
Paramter paramter = new Paramter("", "", "", "authorization_code");

// 只定义请求地址
String url = "https://api.weixin.qq.com/sns/jscode2session";

// 通过RestTemplate发送请求同时传递参数
RestTemplate restTemplate = new RestTemplate();
WxToken wxToken = restTemplate.getForObject(url, WxToken.class, paramter);

踩坑

  • 获取微信小程序的openid时,虽然官方说明文档说传递回来的是json数据,但事实上是text的数据,而RestTemplate在处理响应时,只能处理json数据,所以需要把text的数据转换为json的数据才可以让RestTemplate处理响应

解决问题

  • 创建一个转换数据格式的类,继承自MappingJackson2HttpMessageConverter类
1
2
3
4
5
6
7
8
9
10
class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

public WxMappingJackson2HttpMessageConverter(){
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.TEXT_PLAIN);
mediaTypes.add(MediaType.TEXT_HTML);
setSupportedMediaTypes(mediaTypes);
}

}
  • 在发送请求前,为RestTemplate指定处理响应数据的方式
1
2
3
4
5
// 先指定处理响应数据的方式
restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());

// 再发送请求并处理响应
WxToken wxToken = restTemplate.getForObject(url, WxToken.class);

完成

参考文献

CSDN——kinginblue