背景

对接请求为(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;

}

参考博客

第三方接口如何封装XML请求 以及解析接口返回的XML

RestTemplate发送Post请求postForEntity

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐