发现问题
这几天正在搞微信小程序获取手机号功能开发,发现发送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<String, Object> params = new LinkedMultiValueMap<>();// params.add("code", code);Map<String, Object> 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】。
另外,我们直接打断点进入源码,查看requestCallback:
查看requestCallback的requestEntity即post的body:
可以看到,确实是一个数组类型。
问题找到根源,解决。
——————————————————
其中感谢该博客博主,为我奠定基础:微信小程序报 47001 - data format error hint_一拖再拖 一拖再拖的博客-CSDN博客
我先使用【“一拖再拖”博主】其提供正确的代码,确定了我的entity实体类的phone_info的转换没问题,一开始看到data format error就以为是转换的问题。
然后,才敢大步向前!!究其原因!!