访问远程服务器/其他网站时,如何在Processing / Java中使用loadStrings?

时间:2014-01-07 17:35:46

标签: java applet processing processing-ide

我想在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中工作,我相信这不允许这样的跨数据源。

2 个答案:

答案 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);
  }
}

这是输出:

chart

另一个注意事项:在你的代码中,你在draw()循环中使用loadStrings,这意味着你每秒反复加载相同的数据多次(默认情况下约为60),这不是一个好主意。您应该加载一次数据,在顶级变量中使用它,并在需要时在draw()循环中重复使用加载的数据。

此外,如果您要加载外部数据,则可能需要对小程序进行签名。 查看this guide。我使用相同的指南发布this applet

答案 1 :(得分:1)

如评论中所指出,您将遇到安全问题。

选项1 创建一个从外部URL检索数据的作业,并将其加载到您自己的服务器端数据库中。然后,您需要在加载applet的同一主机上使用服务器端servlet(可能是REST服务)来从数据库中检索数据。

选项2 服务器端servlet,它从远程URL检索数据并将其传递给HTTP响应,这样就不需要加载作业或数据库。

唯一的另一个选择是设置反向代理以绕过相同的原始政策,这是一个可怕的黑客主意。