微信小程序获取手机号47001 data format error hint的完美解答(restTemplate发送post请求)

发现问题

这几天正在搞微信小程序获取手机号功能开发,发现发送post请求接口时候,接口返回如下错误:

{
    "errcode": 47001,
    "errmsg": "data format error hint: [******] rid: ******"
}

post请求的url为:

https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={access_token}

现放上正确代码:

    public WxPhoneDTO getPhoneNumber(String accessToken, String code) {
        String phoneUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={access_token}";

        /** 不要使用这个MultiValueMap,因为会导致request的body的属性都是数组类型,而不是普通的基本数据类型 */
        // MultiValueMap params = new LinkedMultiValueMap<>();
        // params.add("code", code);
        Map params = new LinkedHashMap<>();
        params.put("code", code);

        WxPhoneDTO wxPhoneDTO = restTemplate.postForObject(phoneUrl, params, WxPhoneDTO.class, accessToken);
        return wxPhoneDTO;
    }

 实体类只展示一部分:

@Data
public class WxPhoneDTO {

    @JsonProperty("phone_info")
    private PhoneInfo phoneInfo;

    /**
     * 注意:当API调用成功时,部分接口不会返回 errcode 和 errmsg,只有调用失败时才会返回。
     */
    private Integer errcode;

    private String errmsg;

}

问题分析:

原因:

由于我之前使用的MultiValueMap,而不是普通的Map,会导致request的body的属性都是数组类型,而不是普通的基本数据类型。

验证:

直接使用postman更直观复现
可以看到,我其中的参数code的值是故意使用一个数组(中括号[]表示),就会导致报这个错【47001 data format error hint】

微信小程序获取手机号47001 data format error hint的完美解答(restTemplate发送post请求)_第1张图片

 另外,我们直接打断点进入源码,查看requestCallback

微信小程序获取手机号47001 data format error hint的完美解答(restTemplate发送post请求)_第2张图片

 查看requestCallback的requestEntity即post的body

微信小程序获取手机号47001 data format error hint的完美解答(restTemplate发送post请求)_第3张图片

 可以看到,确实是一个数组类型。

问题找到根源,解决。

——————————————————

其中感谢该博客博主,为我奠定基础:微信小程序报 47001 - data format error hint_一拖再拖 一拖再拖的博客-CSDN博客 

我先使用【“一拖再拖”博主】其提供正确的代码,确定了我的entity实体类的phone_info的转换没问题,一开始看到data format error就以为是转换的问题。

然后,才敢大步向前!!究其原因!!

你可能感兴趣的:(微信小程序,springBoot,微信小程序,获取手机号,47001,format,restTemplate)