Springboot使用RestTemplate发送Post请求postForEntity (application/x-www-form-urlencoded)
Springboot使用RestTemplate发送Post请求postForEntity[application/x-www-form-urlencoded] 背景思路正文ServiceRestTemplate 使用 postForEntity 请求接口基于xml系列注解解析XML返回值XML的一些基本常识实体类与xml文件对应实体代码参考博客背景对接请求为(application/x-www-
·
Springboot使用RestTemplate发送Post请求postForEntity[application/x-www-form-urlencoded]
背景
对接请求为(application/x-www-form-urlencoded),返回XML格式接口。
思路
- ServiceRestTemplate 使用 postForEntity 请求接口
- 基于xml系列注解解析XML返回值
正文
ServiceRestTemplate 使用 postForEntity 请求接口
【注意:application/x-www-form-urlencoded 这个请求头 会对数据镜像 url 编码。不可以传递 非 字符串类型的数据】
//参数
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap(){
{
add("building_id", bo.getBuildingId());
add("coupon_status", bo.getCouponStatus());
add("group_id", "40210");
add("group_sign_id", "40210");
add("currentpage", String.valueOf(bo.getCurrentpage()));
add("pagesize", String.valueOf(bo.getPagesize()));
add("call_time",simpleDateFormat.format(day));
add("sign",sign);
}
};
//封装请求头
RequestEntity requestEntity = RequestEntity
.post(new URI("")) // 可以不填
.contentType(MediaType.APPLICATION_FORM_URLENCODED) // 参数传输类型 url编码格式 application/x-www-form-urlencoded
.accept(MediaType.ALL).acceptCharset(StandardCharsets.UTF_8)
.body(paramMap);
//基于注解映射对应实体
ResponseEntity<HouseCouponsDto> result = restTemplate.postForEntity(url, requestEntity, HouseCouponsDto.class);
为什么使用MultiValueMap实现类(源码)
跟踪postForEntity方法进入execute方法
跟踪execute方法进入doExecute方法(这里要进入ServiceRestTemplate类的doExecute)
跟踪doExecute方法进入doWithRequest方法
这里会便利消息转换器
跟踪doWithRequest方法进入canWrite方法(application/x-www-form-urlencoded进入FormHttpMessageConverter类的canWrite方法)
非 MultiValueMap 子类执行逻辑
MultiValueMap 子类执行逻辑
基于xml系列注解解析XML返回值
XML的一些基本常识
- @XmlAccessorType(XmlAccessType.FIELD) // 访问类型改为字段
- @XmlRootElement(name=“root”)//封装XML对象的根节点
- @XmlElement(name=“Count”) //封装到对应属性
实体类与xml文件对应
实体代码
package com.fang.industry.api.house.newhouse.coupons;
import com.fang.cloud.dto.Dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author: guochao.bj@fang.com
* @createDate: 2021/6/28 16:56
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="root")
@ApiModel(description="楼盘优惠券Dto")
@Data
public class HouseCouponsDto implements Dto {
@XmlElement(name="issuccess")
@ApiModelProperty(value = "请求是否成功.T表示处理成功,F表示处理异常", example = "")
private String issuccess;
@XmlElement(name="code")
@ApiModelProperty(value = "处理失败时的错误代码。issuccess 为F时会给出具体错误代码", example = "")
private String code;
@XmlElement(name="message")
@ApiModelProperty(value = "错误提示信息.当code为T时,为空;当code为F时,不为空", example = "")
private String message;
@XmlElement(name="servertime")
@ApiModelProperty(value = "服务器响应时间")
private String servertime;
@XmlElement(name="Result")
@ApiModelProperty(value = "优惠卷列表")
private HouseCouponsListDto houseCouponsListDto;
}
package com.fang.industry.api.house.newhouse.coupons;
import com.fang.cloud.dto.Dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
/**
* @author: guochao.bj@fang.com
* @createDate: 2021/6/28 18:29
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Result")
@Data
public class HouseCouponsListDto implements Dto {
@XmlElement(name="Count")
@ApiModelProperty(value = "数据总条数")
private String count;
@XmlElement(name="List")
private List<HouseCouponsItemDto> list;
}
参考博客
更多推荐
已为社区贡献2条内容
所有评论(0)