2

ここからデータを取得する単純なプログラムを 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 アプリケーションとして実行すると、完全に機能します。しかし、これを Java アプレット (Processing 1.5 から) としてエクスポートします。これを localhost または OpenProcessing で実行することはできません。Java Machine が実行され、アプレットを実行するかどうか尋ねられます。私はそれを受け入れますが、アプレットはグレーまたは白のままで、何も起こりません。どういう理由ですか?

Java Machine ではコードが他のサーバーから外部データを取得できないというセキュリティ上の問題はありますか? 問題を回避する方法はありますか?

私は JavaScript ではなく、Java/Java アプレット モードで作業していることを強調します。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 を使用します。つまり、同じデータを 1 秒あたり複数回 (デフォルトで約 60 回) ロードしていることを意味します。これはお勧めできません。一度データをロードし、最上位の変数で使用できるようにし、ロードしたデータを必要なときに draw() ループで再利用する必要があります。

また、外部データをロードしている場合は、アプレットに署名する必要がある場合があります。このガイドをご覧ください。このアプレットを投稿するために同じガイドを使用しました。

于 2014-01-08T12:06:07.847 に答える
1

コメントで指摘されているように、セキュリティの問題に遭遇するでしょう。

オプション 1 外部 URL からデータを取得し、独自のサーバー側データベースにロードするジョブを作成します。次に、データベースからデータを取得するために、アプレットをロードした同じホスト上にサーバー側のサーブレット (おそらく REST サービス) が必要になります。

オプション 2 リモート URL からデータを取得し、それを HTTP 応答にパイプするサーバー側サーブレット。この方法では、ロード ジョブやデータベースは必要ありません。

他の唯一のオプションは、リバース プロキシを設定して同じオリジン ポリシーをバイパスすることですが、これはひどいハッキーなアイデアです。

于 2014-01-07T18:03:34.020 に答える