调用亚马逊getOrders API传递NextToken提示无法解码报错如何解决
亚马逊getOrders API NextToken解码错误排查方案
核心报错原因
该错误提示说明亚马逊服务端无法解析你传入的NextToken参数,常见问题如下:
- 双重编码:手动编码参数后被框架二次编码,导致Token变形
- Token本身无效:原始Token被误拼接、截断、混入多余空格
- 编码规则不兼容:框架编码规则不符合亚马逊SP-API要求
具体解决步骤
1. 取消手动编码NextToken
UriComponentsBuilder的queryParam方法会自动对传入的参数值做URL编码,提前调用UriUtils.encode会导致参数被二次编码。比如原始Token中的空格被你手动编码为%20后,框架会再次将%编码为%25,最终传输的%2520在服务端仅解码一次得到%20,和原始Token的空格不符,自然无法解析。
2. 校验NextToken原始值合法性
你提供的NextToken示例存在明显的重复拼接问题:整段Token在末尾HGQ==后又重复了一次完全相同的内容,属于无效值。请先确认你从上游接口获取的原始NextToken是否被错误拼接、截断,或者混入了多余的首尾空格,必须保证传入的原始NextToken和亚马逊返回的内容完全一致。
3. 对齐编码规则为RFC 3986
亚马逊SP-API要求参数编码遵循RFC 3986规范,需要显式配置UriComponentsBuilder的编码规则,避免默认规则不兼容。修正后的代码如下:
String uri = UriComponentsBuilder.fromHttpUrl(applicationConfig.getBaseURL() + applicationConfig.getOrdersApi()) .queryParam("CreatedAfter", "2017-01-20T19:49:35Z") .queryParam("MarketplaceIds", "XXXXXX") .queryParam("MaxResultsPerPage", request.getBatchSize()) // 直接传入原始NextToken,不需要提前编码 .queryParam("NextToken", nextTokenValue) // 显式指定UTF-8编码,遵循RFC3986规范 .encode(StandardCharsets.UTF_8) .build() .toUri() .toString(); restTemplate.setRequestFactory(clientHttpRequestFactory(tokenResponse)); restTemplate.exchange(uri, HttpMethod.GET, entity, AmazonSellingOrders.class);
4. 兜底校验
如果修改后仍报错,可以打印最终生成的完整请求URL,取出其中NextToken的参数值做一次URL解码,确认解码后的内容和你拿到的原始NextToken完全一致,如果不一致说明代码中还有其他额外的编码逻辑需要排查。
内容的提问来源于stack exchange,提问作者Arundhathi D
相关产品推荐
相关产品推荐

