2

我想在处理中编写一个简单的程序,它将从这里获取数据:

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

当我直接从处理 IDE(从处理 1.5 和 2.0)将其作为 Java 应用程序运行时,这非常有效。但后来我将它导出为 Java Applet(来自 Processing 1.5)我无法在 localhost 或 OpenProcessing 上运行它。Java 机器运行,询问我是否要运行小程序,我接受,然后小程序保持灰色或白色,没有任何反应。什么原因?

是否存在任何安全问题,Java Machine 不允许代码从其他服务器获取外部数据?有没有办法绕过这个问题?

我强调,我在 Java/Java Applet 模式下工作,而不是在 JavaScript 中工作,我确信 JavaScript 不允许这种跨源数据。

4

2 回答 2

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() 循环中重用加载的数据。

此外,如果您正在加载外部数据,您可能需要对小程序进行签名。查看本指南。我使用相同的指南来发布这个小程序

于 2014-01-08T12:06:07.847 回答
1

正如评论中指出的那样,您将遇到安全问题。

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

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

唯一的其他选择是设置反向代理来绕过同源策略,这是一个可怕的骇人听闻的想法。

于 2014-01-07T18:03:34.020 回答