1.普通参数
@RequestMapping("/info")
@ResponseBody
public String getInfo(String name, Integer age) { // 三选一即可
// 方式1:url直接拼接参数
String url = "http://localhost:8888/info?name="+name+"&age="+age;
return restTemplate.postForObject(url, null, String.class);
// 方式2:url拼接{占位符},将参数按占位符的顺序依次传入,花括号中用1,2,3,4占位也可以
String url = "http://localhost:8888/info?name={name}&age={age}";
return restTemplate.postForObject(url, null, String.class, name, age);
// 方式3:将参数封装成map,传入map
String url = "http://localhost:8888/info?name={name}&age={age}";
Map<String,String> params = new HashMap<>();
params.put("name", name);
params.put("age", age+"");
return restTemplate.postForObject(url, null, String.class, params);
}
2.Java对象
2.1 URL拼接
@RequestMapping(value = "/stuInfo", method = RequestMethod.POST)
@ResponseBody
public String getStuInfo(Student stu) {
// 依旧是URL拼接,此处借助自定义的genParams方法将对象变为"参数1=值1&参数2=值2"的形式
String url = "http://localhost:8888/stuInfo?" + genParams(stu);
return restTemplate.postForObject(url, null, String.class);
}
/**
* 通过反射,获取对象的每个属性和值,拼接成name=lanying&age=18的格式
* @param obj
* @return
*/
private String genParams(Object obj){
if(obj == null) return "";
Class<?> cls = obj.getClass(); // 获取Class对象
Field[] fields = cls.getDeclaredFields(); // 获取类中声明的所有属性
StringBuilder sb = new StringBuilder(); // 用于拼接字符串
for(Field f : fields){
try {
String fName = f.getName(); // 获取属性名
Method method = null;
try{
// name ==> getName(属性需要提供getter方法)
String methodName = "get"+fName.substring(0, 1).toUpperCase()+fName.substring(1); // 拼接方法名
method = cls.getDeclaredMethod(methodName); // 获取Method对象
}catch (NoSuchMethodException e){
// flag ==> isFlag(布尔类型的属性自动生成getter方法时有时是is开头的)
String methodName = "is"+fName.substring(0, 1).toUpperCase()+fName.substring(1); // 拼接方法名
method = cls.getDeclaredMethod(methodName); // 获取Method对象
}
Object value = method.invoke(obj); // 调用obj的method方法,获取属性的值
if(value == null) continue; // 跳过值为null的参数
sb.append("&"+fName+"="+value); // 拼接成"&参数1=值1&参数2=值2"的形式
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
}
if(sb.length() > 0) {
return sb.replace(0, 1, "").toString(); // 把开头的&去掉
}else{
return "";
}
}
2.2 HttpEntity
@RequestMapping(value = "/stuInfo", method = RequestMethod.POST)
@ResponseBody
public String getStuInfo(Student stu) {
String url = "http://localhost:8888/stuInfo";
return restTemplate.postForObject(url, genHttpEntity(stu), String.class); // 自定义的genHttpEntity(xx)方法
}
导包:
import org.springframework.http.HttpEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
/**
* 通过反射,获取对象的每个属性和值,并将属性、值封装到HttpEntity对象的Body中
* @param obj
* @return
*/
private HttpEntity<MultiValueMap> genHttpEntity(Object obj){
if(obj == null) return null;
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
Class<?> cls = obj.getClass(); // 获取Class对象
Field[] fields = cls.getDeclaredFields(); // 获取类中声明的所有属性
for(Field f : fields){
try {
String fName = f.getName(); // 获取属性名
Method method = null;
try{
// name ==> getName(属性需要提供getter方法)
String methodName = "get"+fName.substring(0, 1).toUpperCase()+fName.substring(1); // 拼接方法名
method = cls.getDeclaredMethod(methodName); // 获取Method对象
}catch (NoSuchMethodException e){
// flag ==> isFlag(布尔类型的属性自动生成getter方法时有时是is开头的)
String methodName = "is"+fName.substring(0, 1).toUpperCase()+fName.substring(1); // 拼接方法名
method = cls.getDeclaredMethod(methodName); // 获取Method对象
}
Object value = method.invoke(obj); // 调用obj的method方法,获取属性的值
if(value == null) continue; // 跳过值为null的参数
requestBody.add(fName, value+"");
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
}
return new HttpEntity<>(requestBody, null);
}
3.加了@RequestBody注解的Java对象
@RequestMapping("/stu")
@ResponseBody
public String getStu(@RequestBody Student stu) {
// 可以直接将这个Java对象作为请求体传入postForObject的第二个参数
return restTemplate.postForObject("http://localhost:8888/stuComment", stu, String.class);
}
4.加了@RequestBody注解的Java对象 + 普通参数
@RequestMapping("/stuComment")
@ResponseBody
public String getStuComment(@RequestBody Student stu, String comment) {
// @RequestBody修饰的对象直接传入postForObject的第二个参数
// 普通参数拼接到URL上
return restTemplate.postForObject("http://localhost:8888/stuComment?comment={comment}", stu, String.class, comment);
}