【问题标题】:JAX-RS Jersey REST api call mappingJAX-RS Jersey REST api 调用映射
【发布时间】:2018-01-10 22:56:09
【问题描述】:

我试图在 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 类中正确映射它? 这是我尝试过的

StockREST.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 消息打印 Symbol = null price, = 0.0, volume = 0.0, timestamp = null

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

编辑

更新了 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();
}
}

【问题讨论】:

    标签: java json rest jersey jax-rs


    【解决方案1】:

    首先,您返回的对象不是 StockREST,而是您可以调用 Response 的组合对象,需要将其映射到类 Response.class

    .get(StockREST.class);
    

    成为

    .get(Response.class);
    

    那么无效的java字段名必须映射到有效的java字段名

    “1.symbol”必须映射到对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();
        }
    

    作业做完了, 享受

    【讨论】:

    • 感谢您的宝贵时间。我已经添加了这 3 个类,以及它们的 getter 和 setter。现在我在第一篇文章中更新了我的 RESTClient.java。你能告诉我是否必须做其他事情来显示输出吗?非常感谢
    • 如果您的意思是使用 System.out.println 调用显示对象数据,那么您需要像在 StockREST 中那样为每个对象定义 toString() 方法。如果不是,你指的是哪种“支付”?
    • 我只想显示交易品种/价格/交易量/时间戳对象。如果你有时间,你能告诉我一个如何做到这一点的例子吗?再次感谢。当我尝试 Sysout(exchange) 或 sysout(stockQuotes) 它打印 null
    猜你喜欢
    • 2012-06-26
    • 2013-10-18
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2016-12-18
    • 2015-04-25
    相关资源
    最近更新 更多