Как использовать 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, таким образом, не нужно загружать задание или базу данных.
Единственный другой вариант - настроить обратный прокси-сервер для обхода той же политики происхождения, что является ужасной хакерской идеей.