Bootstrap

RestTemplate的postForObject如何传参

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); 
}

 

;