JAX-RS Jersey REST API 调用映射



im试图让我在jersey/java中使用Rest服务。我请求的链接类似于

https://www.alphavantage.co/query?function=BATCH_STOCK_QUOTES&symbols=MSFT,FB,AAPL&apikey=demo 请注意,这是一个演示链接。

JSON 响应如下所示:

{
    "Meta Data": {
        "1. Information": "Batch Stock Market Quotes",
        "2. Notes": "IEX Real-Time Price provided for free by IEX (https://iextrading.com/developer/).",
        "3. Time Zone": "US/Eastern"
    },
    "Stock Quotes": [
        {
            "1. symbol": "MSFT",
            "2. price": "87.8300",
            "3. volume": "18638820",
            "4. timestamp": "2018-01-10 16:00:00"
        },
        {
            "1. symbol": "FB",
            "2. price": "187.8100",
            "3. volume": "10515752",
            "4. timestamp": "2018-01-10 16:00:00"
        },
        {
            "1. symbol": "AAPL",
            "2. price": "174.2500",
            "3. volume": "23771860",
            "4. timestamp": "2018-01-10 16:00:00"
        }
    ]
}

我的问题是如何在 java 类中正确映射它?这是我尝试过的

股票休息.java

public class StockREST {
    private String symbol;
    private float price;
    private float volume;
    private String timestamp;
    public String getStockQuotes() {
        return StockQuotes;
    }
    public void setStockQuotes(String StockQuotes) {
        this.StockQuotes = StockQuotes;
    }
   private String StockQuotes;
    public String getSymbol() {
        return symbol;
    }
    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    public float getVolume() {
        return volume;
    }
    public void setVolume(float volume) {
        this.volume = volume;
    }
    public String getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }
     @Override
public String toString() {
    return "Symbol = " + symbol + " price, = "
            + price + ", volume = " + volume + ", timestamp = " + timestamp;
}

}

RESTclient.java

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
/**
 *
 * @author Me
 */
public class RESTclient {
    public static void main(String[] args) {
    Client client = ClientBuilder.newClient();
StockREST exchange = client.target("https://www.alphavantage.co/query?function=BATCH_STOCK_QUOTES&symbols=MSFT&apikey=B1KLWMIAGSG0UWYD") 
                      .request(MediaType.APPLICATION_JSON)
                      .get(StockREST.class);

 String symbol = exchange.getSymbol();
float price = exchange.getPrice();
float volume = exchange.getVolume();
String timestamp = exchange.getTimestamp();

System.out.println(exchange);

client.close();
}
}

打印 SOUT 消息交易品种 = 空价格,= 0.0,交易量 = 0.0,时间戳 = 空

我尝试使用数组/列表,但仍然感到困惑。谢谢

编辑

更新了 RESTClient.java

public class RESTclient {
    public static void main(String[] args) {
    Client client = ClientBuilder.newClient();
Response exchange = client.target("https://www.alphavantage.co/query?function=BATCH_STOCK_QUOTES&symbols=MSFT&apikey=B1KLWMIAGSG0UWYD") 
                      .request(MediaType.APPLICATION_JSON)
                      .get(Response.class);

// String symbol = exchange.getSymbol();
MetaData metaData = exchange.getMetaData();
List<StockQuote> stockQuotes = exchange.getStockQuotes();
//float price = exchange.getPrice();
//float volume = exchange.getVolume();
//String timestamp = exchange.getTimestamp();

System.out.println(exchange);

client.close();
}
}
首先,

返回的对象不是 StockREST,而是一个组合对象,您可以调用 Response 该对象,该对象需要映射到类 Response.class

.get(StockREST.class);

成为

.get(Response.class);

然后,必须将无效的 java 字段名称映射到有效的 java 字段名称

"1.符号"必须映射到对Java有效的东西,如"symbol">

以下是针对您的情况具有准确映射的类(省略了 getter 和 setter(

@XmlRootElement
public class Response {
    @XmlAttribute(name = "Meta Data")
    private MetaData metaData;
    @XmlAttribute(name = "Stock Quotes")
    private List<StockQuote> stockQuotes;
}
public class MetaData {
    @XmlAttribute(name = "1. Information")
    private String information;
    @XmlAttribute(name = "2. Notes")
    private String notes;
    @XmlAttribute(name = "3. Time Zone")
    private String timeZone;
}
public class StockQuote {
    @XmlAttribute(name = "1. symbol")
    private String symbol;
    @XmlAttribute(name = "2. price")
    private float price;
    @XmlAttribute(name = "3. volume")
    private float volume;
    @XmlAttribute(name = "4. timestamp")
    private String timestamp;
}

编辑:

此外,您正在请求安全 URL (https(,因此您需要提供包含受信任 SSL 证书的信任库才能访问您的 URL

以下代码绕过证书检查,这是错误的

public static void main(String[] args) {
     // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){
            public X509Certificate[] getAcceptedIssuers(){return null;}
            public void checkClientTrusted(X509Certificate[] certs, String authType){}
            public void checkServerTrusted(X509Certificate[] certs, String authType){}
        }};
        // Install the all-trusting trust manager
        SSLContext sc = null;
        try {
            sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            System.out.println(e);
        }
        Client client = ClientBuilder.newBuilder().sslContext(sc).build();
        Response exchange = client.target("https://www.alphavantage.co/query?function=BATCH_STOCK_QUOTES&symbols=MSFT&apikey=B1KLWMIAGSG0UWYD") 
                              .request(MediaType.APPLICATION_JSON)
                              .get(Response.class);
        System.out.println(exchange.getMetaData());
        for (StockQuote sq : exchange.getStockQuotes()) {
            System.out.println(sq);
        }

        client.close();
    }

完成作业,享受

最新更新