首页 > 解决方案 > 为什么这个 sendAsync 请求 String BodyHandler 返回一个空数组?

问题描述

这是我的方法的代码,该方法应该从 Binance 获取 5 分钟的蜡烛。(我有一个方法头,stackoverflow 代码插入有问题,我不知道如何使用它。忽略空方法头,它的返回类型是字符串)

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
                
        .GET()
        .uri(URI.create(API_URL + "api/v3/klines?symbol=BTCUSDT&interval=5m"))
        .build();
    ArrayList<String> fetchedData = new ArrayList<String>();
    System.out.println(fetchedData);
        
    client.sendAsync(request,HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(fetchedData::add)
    .join();

        
    String aString = fetchedData.get(0);
    return(aString);   

但是,aString 只是空括号 []。我不确定如何遍历这个数组并返回我感兴趣的数据。相比之下,我有一个函数方法,它通过调用另一个 API 端点并执行字符串遍历从服务器检索价格。

public double getPrice() {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            
            .GET()
            .uri(URI.create(API_URL + "api/v3/ticker/24hr?symbol=BTCUSDT"))
            .build();
    ArrayList<String> fetchedData = new ArrayList<String>();
    
    client.sendAsync(request,HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(fetchedData::add)
        .join();
    
    // Begin resource intensive string search for BTCUSDT Last Price
    ////
    String aString = fetchedData.get(0);
    String bString = "";
    String cString = "";
    String price = "";
    double doublePrice = 0.0;
    boolean foundBTCUSDT = false;
    boolean foundLastPrice = false;
    boolean foundPrice = false;
    int savedStartBTCUSDT = 0;
    int savedStartLastPrice = 0;
    
    for(int k = 0; k < aString.length() && !foundBTCUSDT; k++) {
        
        if(aString.charAt(k) == 'B'){
            savedStartBTCUSDT = k;
                if(aString.charAt(k+1) == 'T') {
                    if (aString.charAt(k+2) == 'C') {
                        if (aString.charAt(k+3) == 'U') {
                            if(aString.charAt(k+4) == 'S')
                                if (aString.charAt(k+5) == 'D') {
                                    if (aString.charAt(k+6) == 'T') {
                                        foundBTCUSDT = true;
                                    }
                                }
                        }
                    }
                        
                }
            
        }
    }
    
    bString = aString.substring(savedStartBTCUSDT);
    
    for(int i = 0; i < bString.length() && !foundLastPrice; i++){
        if(bString.charAt(i) == 't'){
            savedStartLastPrice = i;
                if(bString.charAt(i+1) == 'P') {
                    if (bString.charAt(i+2) == 'r') {
                        if (bString.charAt(i+3) == 'i') {
                            if(bString.charAt(i+4) == 'c')
                                if (bString.charAt(i+5) == 'e') {
                                    if (bString.charAt(i+6) == '"') {
                                        if (bString.charAt(i+7) == ':') {
                                            if(bString.charAt(i+8) == '"') {
                                                foundLastPrice = true;
                                            }
                                        }
                                    }
                                    }
                                }
                        }
                    }
                        
                }
}
    
    cString = bString.substring(savedStartLastPrice+9);
    
    
    for(int c = 0; !foundPrice; c++) {
        if(cString.charAt(c) == '"') {
            price = cString.substring(0, c);
            foundPrice = true;
        }
    }
    
    doublePrice = Double.parseDouble(price);
    
    return(doublePrice);
}

谁能帮助我使用第一种方法并告诉我如何执行功能数组遍历以获取我感兴趣的信息?谢谢。

标签: javahttprequesthttpclientbinance

解决方案


推荐阅读