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();
}
完成作业,享受