You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:16:06