Как использовать loadStrings в Processing/Java при доступе к удаленному серверу / другому веб-сайту?

Я хочу написать простую программу в обработке, которая будет принимать данные отсюда:

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-приложение непосредственно из Processing IDE (из Processing 1.5 и 2.0). Но затем я экспортирую это как Java-апплет (из Обработки 1.5), я не могу выполнить это ни на localhost, ни на OpenProcessing. Java Machine запускает, спрашивает, хочу ли я запустить апплет, я принимаю это, а затем апплет остается серым или белым, и ничего не происходит. В чем причина?

Есть ли какая-то проблема безопасности, что Java Machine не позволяет коду получать внешние данные с другого сервера? Есть ли способ обойти проблему?

Я подчеркиваю, что я работаю в режиме Java/Java Applet, а не в JavaScript, который, я уверен, не допускает такой перекрестный источник данных.

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

И вот вывод:

диаграмма

Еще одно замечание: в вашем коде вы используете loadStrings в цикле draw(), что означает, что вы загружаете одни и те же данные снова и снова несколько раз (по умолчанию около 60) в секунду, что не очень хорошая идея. Вы должны загрузить данные один раз, сделать их доступными в переменной верхнего уровня и повторно использовать загруженные данные в цикле draw(), когда вам это нужно.

Кроме того, если вы загружаете внешние данные, вам может потребоваться подписать апплет. Проверьте это руководство. Я использовал то же руководство, чтобы опубликовать этот апплет.

Вы столкнетесь с проблемами безопасности, как указано в комментариях.

Параметры 1 Создайте задание, которое извлекает данные из внешнего URL-адреса и загружает их в собственную базу данных на стороне сервера. Затем вам потребуется сервлет на стороне сервера (возможно, служба REST) ​​на том же хосте, на котором загружен ваш апплет, для извлечения данных из вашей базы данных.

Варианты 2 Сервлет на стороне сервера, который извлекает данные из удаленного URL-адреса и передает их в ответ HTTP, таким образом, не нужно загружать задание или базу данных.

Единственный другой вариант - настроить обратный прокси-сервер для обхода той же политики происхождения, что является ужасной хакерской идеей.

Другие вопросы по тегам