我想在Processing中编写一个简单的程序,它将从这里获取数据:
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);
}
当我直接从Processing IDE(来自Processing 1.5和2.0)将其作为Java Application运行时,这非常有效。但后来我将其导出为Java Applet(来自Processing 1.5)我无法在localhost或OpenProcessing上运行它。 Java Machine运行,询问我是否要运行applet,我接受,然后applet保持灰色或白色,没有任何反应。是什么原因?
是否存在任何安全问题,Java Machine不允许代码从其他服务器获取外部数据?有什么方法可以解决这个问题吗?
我强调,我在Java / Java Applet模式下工作,而不是在JavaScript中工作,我相信这不允许这样的跨数据源。
答案 0 :(得分: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);
}
}
这是输出:
另一个注意事项:在你的代码中,你在draw()循环中使用loadStrings,这意味着你每秒反复加载相同的数据多次(默认情况下约为60),这不是一个好主意。您应该加载一次数据,在顶级变量中使用它,并在需要时在draw()循环中重复使用加载的数据。
此外,如果您要加载外部数据,则可能需要对小程序进行签名。 查看this guide。我使用相同的指南发布this applet。
答案 1 :(得分:1)
如评论中所指出,您将遇到安全问题。
选项1 创建一个从外部URL检索数据的作业,并将其加载到您自己的服务器端数据库中。然后,您需要在加载applet的同一主机上使用服务器端servlet(可能是REST服务)来从数据库中检索数据。
选项2 服务器端servlet,它从远程URL检索数据并将其传递给HTTP响应,这样就不需要加载作业或数据库。
唯一的另一个选择是设置反向代理以绕过相同的原始政策,这是一个可怕的黑客主意。