FedEx API返回编码乱码并报400 Bad Request错误的原因
联邦快递地址校验接口调用异常排查
问题表现
调用FedEx Address Validation API(联邦快递地址校验接口)时,接口返回无法正常解析的乱码字符,同时返回400 Bad Request错误响应。出于信息安全考虑,以下请求体已隐去密钥信息:
POST /address/v1/addresses/resolve HTTP/1.1 Content-Type: application/json x-customer-transaction-id: x-locale: en_US authorization: Bearer {my secret key} { "addressesToValidate": [ { "address":{ "streetLines":[ "1234 Example Rd.", "" ], "city":"Morris", "stateOrProvinceCode":"AL", "postalCode":"35116", "countryCode":"US" } }] }
接口返回的乱码响应内容如下:
HTTP/1.1 400 BadRequest Content-Type: application/json;charset=UTF-8 Content-Encoding: gzip Connection: close Server-Timing: cdn-cache; desc=MISS,edge; dur=115,origin; dur=62 Content-Length: 175 Date: Tue, 28 Jun 2022 18:47:56 GMT Server: Layer7-API-Gateway �ʱ�0�_��l�a�Ƞ���p�6�6�@B�������;2�d���+�)�$�4�B%b�L�3 W"�%�N�L��9�<���U9n7��,���REY����{j�Z�=��í�A��Z�8�L���J�Lvp��=���M@ i������ϱ
问题原因&修复方案
乱码问题根因
响应头明确标注了Content-Encoding: gzip,说明返回体是gzip压缩后的二进制数据,当前客户端没有配置gzip解压逻辑,直接把原始二进制字节流按UTF-8编码解析为文本,必然出现乱码,根本读不到接口返回的真实错误提示。
修复方式:给HTTP客户端增加自动解压逻辑,识别响应头的Content-Encoding字段,对gzip格式的返回内容先解压再做文本解析,就能拿到结构化的JSON错误信息,精准定位参数问题。
400错误前置排查点
在拿到解压后的真实错误信息前,可以先对照接口规则修正现有请求的明显问题:
x-customer-transaction-id为必填请求头,当前传值为空,需要传入任意唯一字符串用于请求链路追踪streetLines数组不允许传入空字符串,当前第二个元素是空值,要么删除该空项,要么传入真实的第二行地址内容- 确认请求携带的Bearer Token在有效期内,且对应账号拥有地址校验接口的调用权限
内容的提问来源于stack exchange,提问作者Matthew Vines
相关产品推荐
相关产品推荐

