使用Retrofit发起JSON GET请求失败,API响应解析遇阻
问题:新Bittrex API的参数传递与响应解析困惑
我之前使用旧Bittrex API的代码可以正常运行,但切换到新API后,遇到了两个核心问题:
- 不清楚调用API时需要在
Map中传入哪些参数 - 不知道如何解析API响应,尤其是
result数组(不确定是否要使用ArrayList)
我已经掌握旧API的可行实现,但新API的处理逻辑完全理不清。以下是我目前写的无法正常运行的代码片段:
问题代码片段
Datas.class
package Model.BittrexApiModel; public class Datas { private Result result; public Result getResult() { return result; } public void setResult(Result result) { this.result = result; } public Datas withDatas(Result result){ this.result=result; return this; } }
Result POJO类
package Model.BittrexApiModel; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Result { @SerializedName("MarketName") @Expose private String marketName; @SerializedName("High") @Expose private Double high; @SerializedName("Low") @Expose private Double low; @SerializedName("Volume") @Expose private Double volume; @SerializedName("Last") @Expose private Double last; @SerializedName("BaseVolume") @Expose private Double baseVolume; @SerializedName("TimeStamp") @Expose private String timeStamp; @SerializedName("Bid") @Expose private Double bid; @SerializedName("Ask") @Expose private Double ask; @SerializedName("OpenBuyOrders") @Expose private Integer openBuyOrders; @SerializedName("OpenSellOrders") @Expose private Integer openSellOrders; @SerializedName("PrevDay") @Expose private Double prevDay; @SerializedName("Created") @Expose private String created; // 以下为getter、setter及with方法(略) }
BittrexResponse.class(未完成,疑似存在问题)
package Model.BittrexApiModel; import java.util.Map; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class BittrexResponse { @SerializedName("success") @Expose private Boolean succ
解决方案
1. 修正POJO类以匹配新API响应结构
根据新Bittrex API的响应格式,result字段是数组/列表类型(而非单个对象),同时完整的响应应该包含success、message和result三个核心字段。我们需要调整POJO类:
修正后的BittrexResponse.class
package Model.BittrexApiModel; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class BittrexResponse { @SerializedName("success") @Expose private Boolean success; @SerializedName("message") @Expose private String message; @SerializedName("result") @Expose private List<Result> result; // 这里改为List<Result>,对应API返回的数组 // Getter、Setter方法 public Boolean getSuccess() { return success; } public void setSuccess(Boolean success) { this.success = success; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public List<Result> getResult() { return result; } public void setResult(List<Result> result) { this.result = result; } }
移除多余的Datas类
你的Datas类是多余的,直接用BittrexResponse接收完整响应即可,无需额外包装。
2. API调用的参数传递
新Bittrex API的参数取决于你调用的具体接口(比如市场行情、订单查询等):
- 公开接口(无需身份验证):比如获取市场行情的接口,通常不需要额外参数,直接发起GET请求即可
- 私有接口(需要身份验证):需要在请求中传入
apikey、nonce(防重放标识)、签名等参数,具体规则请参考新API文档的身份验证要求
3. 响应解析示例(使用Gson)
假设你用Gson来解析响应,代码示例如下:
import com.google.gson.Gson; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; public class BittrexApiClient { public static void main(String[] args) { try { // 新API的公开行情接口示例URL URL url = new URL("https://api.bittrex.com/v3/markets/tickers"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 解析响应到BittrexResponse对象 Gson gson = new Gson(); BittrexResponse apiResponse = gson.fromJson(response.toString(), BittrexResponse.class); // 处理result列表 if (apiResponse.getSuccess()) { List<Result> marketDataList = apiResponse.getResult(); for (Result marketData : marketDataList) { System.out.println("市场名称: " + marketData.getMarketName()); System.out.println("最新价格: " + marketData.getLast()); // 其他字段处理... } } else { System.err.println("API调用失败: " + apiResponse.getMessage()); } } catch (Exception e) { e.printStackTrace(); } } }
关键注意点
- 确保
Result类中所有字段的SerializedName与新API返回的字段名完全匹配(注意大小写,新API可能使用驼峰或蛇形命名) - 私有接口需要严格按照API文档要求生成签名,否则会返回权限错误
- 如果某些API直接返回
result数组(而非包含success的包装对象),则直接解析为List<Result>即可,无需BittrexResponse包装
内容的提问来源于stack exchange,提问作者Čika Tuna
相关产品推荐
相关产品推荐

