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

访问远程服务器/其他网站时,如何在Processing/Java中使用LoadString?,java,applet,processing,processing-ide,Java,Applet,Processing,Processing Ide,我想在Processing中编写一个简单的程序,从这里获取数据: 并在图表中显示它们。让我们考虑访问数据的最简单的例子: 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); } 当我直接从Processin

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

并在图表中显示它们。让我们考虑访问数据的最简单的例子:

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应用程序的形式运行这个应用程序时,这种方法非常有效。但是我将其导出为Java小程序(来自Processing 1.5),我不能在localhost或OpenProcessing上运行它。Java机器运行,询问,我是否想运行小程序,我接受,然后小程序保持灰色或白色,什么也不发生。原因是什么

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


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

您将遇到评论中指出的安全问题

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

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


唯一的另一个选择是设置反向代理以绕过同源策略,这是一个可怕的黑客想法。

您正在加载的数据是一个JSON格式的数组,因此在这种情况下LoadString不会非常有用

您应该使用和来解析正在加载的数组中每个条目的数据

以下是仅使用
金额
值的基本示例:

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);
  }
}
void setup(){
JSONArray数据=加载JSONArray(“https://btc-e.com/api/2/btc_usd/trades“”;//加载数据
对于(inti=0;i
以下是输出:

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

此外,如果正在加载外部数据,则可能需要对小程序进行签名。
退房我也使用了相同的指南来发布。

您能否在加载字符串时尝试一下,然后得到错误消息?您还可以发布您的
loadStrings
方法吗?您应该会看到Java中存在某种错误,这很可能与安全性有关。@ns47731-loadStrings是处理提供的方法,它不是我的。@zapl-似乎这就是原因。你给我的消息来源说:“沙盒小程序不能(…)从任何第三方服务器(它来自的服务器以外的任何服务器)检索资源。”这很遗憾……你签署了小程序吗?