2014-01-07 28 views
1

我想寫在處理一個簡單的程序,會從這裏取數據:如何在訪問遠程服務器/其他網站時在Processing/Java中使用loadStrings?

https://btc-e.com/api/2/btc_usd/trades

,並在圖表中顯示出來。讓我們考慮訪問數據的最簡單的例子:

void setup() { 
    size(400,400); 
} 

void draw() { 
    background(0); 
    fill(244); 
    String[] t = loadStrings("https://btc-e.com/api/2/btc_usd/trades"); 
    text(t[0],100,100); 
} 

這完美的作品,當我運行這個作爲Java應用程序直接處理IDE(來自加工1.5和2.0)。但是,然後我將其導出爲Java Applet(來自Processing 1.5),我無法在localhost或OpenProcessing上運行此操作。 Java Machine運行,詢問我是否想運行該小程序,我接受該程序,然後小程序保持灰色或白色,並且沒有任何反應。什麼原因?

是否有任何安全問題,即Java機器不允許代碼從其他服務器獲取外部數據?有什麼方法可以解決問題嗎?

我強調,我使用的是Java/Java Applet模式,而不是JavaScript,我確信它不允許交叉數據源。

+0

你可以嘗試抓住你的字符串加載並得到一個錯誤信息?你也可以發佈你的'loadStrings'方法 –

+2

你應該在Java [console]中看到某種錯誤(http://docs.oracle.com/javase/7/docs/technotes/guides/deployment/deployment-guide/ console.html),這很可能是關於某些安全性[限制Applets](http://docs.oracle.com/javase/tutorial/deployment/applet/security.html)。 – zapl

+0

@ ns47731 - loadStrings是Processing提供的方法,它不是我的。 –

回答

2

您正在加載的數據是JSON格式的數組,因此loadStrings在這種情況下不會非常有用。

您應該使用loadJSONArray()JSONObject來解析您加載的數組中每個條目的數據。

下面是僅使用amount值基本樣本:

void setup(){ 
    JSONArray data = loadJSONArray("https://btc-e.com/api/2/btc_usd/trades");//load the data 

    for (int i = 0; i < data.size(); i++) {//traverse the data 

    JSONObject entry = data.getJSONObject(i); //get each entry in the list/array 
    //parse the values 
    float amount = entry.getFloat("amount"); 
    int price = entry.getInt("price"); 
    String item = entry.getString("item"); 
    String pc = entry.getString("price_currency"); 
    int tid  = entry.getInt("tid"); 
    int date  = entry.getInt("date"); 
    String tt = entry.getString("trade_type"); 

    //do something with the data 
    float x = (float)i/data.size() * width; 
    float y = 100 - (amount * 20); 
    line(x,height,x,y); 
    } 
} 

和這裏的輸出:

chart

另注:在你的代碼,你的畫用loadStrings()循環,這意味着你每次重複加載相同的數據多次(默認約60),這不是一個好主意。您應該加載一次數據,使其在頂層變量中可用,並在需要時在draw()循環中重新使用加載的數據。

此外,如果您要加載外部數據,則可能需要對小程序進行簽名。 結賬this guide。我使用了相同的指南來發布this applet

1

您將遇到註釋中指出的安全問題。

選項1 創建一個作業,從外部URL中檢索數據並將其加載到您自己的服務器端數據庫中。然後,您需要在加載小應用程序的同一主機上使用服務器端servlet(可能是REST服務)來檢索數據庫中的數據。

選項2 服務器端servlet從遠程URL檢索數據並將其管理到HTTP響應,這樣就不需要裝載作業或數據庫。

唯一的另一種選擇是設置一個反向代理繞過相同的原始策略,這是一個可怕的黑客主意。