调用Coinbase分页接口使用next_uri请求返回Not Found错误如何解决
问题排查结果
根因定位
错误是JAX-RS客户端path()方法的自动URL编码逻辑导致的:
- 接口返回的
next_uri本身已经携带查询参数分隔符?,而path()方法会对传入的所有字符串做URL转义处理,导致?被转义为%3F - 服务端最终收到的请求路径是
/v2/accounts%3Fstarting_after=ef35df6c-a45b-5858-b755-f12a709cf26e,会把转义后的%3F当成路径的一部分,无法匹配到对应的接口,因此返回404错误。
修复方案
最简便的修改方式是直接拼接完整请求URL传入target()方法,避开path()的自动编码逻辑,修改后的代码如下:
ArrayList<X> results = new ArrayList<>(); String uri = "/v2/accounts"; javax.ws.rs.client.Client client = getClient(); while(uri != null){ // 直接拼接完整URL,跳过path方法的编码处理 T response = client.target("https://api.coinbase.com" + uri) .request(MediaType.APPLICATION_JSON).get(responseType); results.addAll(response.getData()); uri = response.getPagination() == null ? null : response.getPagination().getNextUri(); } return results;
如果需要保留path()的使用,也可以将next_uri拆分为路径部分和查询参数部分,分别调用path()和queryParam()方法传入即可。
内容的提问来源于stack exchange,提问作者antlen
相关产品推荐
相关产品推荐

