首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAX-RS Jersey REST api调用映射

JAX-RS Jersey REST api调用映射
EN

Stack Overflow用户
提问于 2018-01-11 06:56:10
回答 1查看 1K关注 0票数 0

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

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

JSON响应如下:

代码语言:javascript
复制
{
    "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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 08:13:44

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

代码语言:javascript
复制
.get(StockREST.class);

成为

代码语言:javascript
复制
.get(Response.class);

则必须将无效的java字段名映射到有效的java字段名

"1. symbol“必须映射到对java有效的内容,如"symbol”。

下面是根据您的情况精确映射的类(省略了getter和setter)

代码语言:javascript
复制
@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

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

代码语言:javascript
复制
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();
    }

作业做完了,好好享受吧

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48197444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档