HTTPによるJSONデータの読み込み
HTTPレスポンスの結果を、構造化されたデータとして受け取れるとアプリケーションとしての利用が容易になります。 構造化されたデータをテキストやバイト列に変換することを シリアライゼーション と呼びます。 JSON は構造化データの通信で広く利用されるシリアライゼーション形式の1つです。 JSONは、元々はJavaScriptでのオブジェクトを表記するための形式でしたが、現在では言語を問わずに多くの場面で利用されています。
shibe.online では、画像のURLの情報をJSON形式で取得することができます。 例えば以下のURLにアクセスすると、10枚の画像のURLを、文字列の配列構造をしたJSON形式で取得することができます。
http://shibe.online/api/shibes?count=10&urls=true&httpsUrls=false
以下は、shibe.online から画像のURLを取得してコンソールに表示するプログラムです。
import processing.net.*;
size(400, 400);
Client client = new Client(this, "shibe.online", 80);
client.write("GET /api/shibes?count=10&urls=true&httpsUrls=false HTTP/1.1\r\n");
client.write("Host: shibe.online\r\n");
client.write("\r\n");
while (client.active()) {
if (client.available() > 0) {
String line = client.readStringUntil('\n');
print(line);
if (line != null && line.length() == 2) {
break;
}
}
}
int bufferIndex = 0;
byte[] buffer = new byte[1000000];
while (client.active()) {
String line = client.readStringUntil('\n');
int size = unhex(trim(line));
if (size == 0) {
break;
}
for (int i = 0; i < size; ++i) {
buffer[bufferIndex++] = (byte)client.read();
}
client.readStringUntil('\n');
}
String body = new String(buffer, 0, bufferIndex);
JSONArray json = parseJSONArray(body);
for (int i = 0; i < json.size(); ++i) {
String url = json.getString(i);
println(url);
}
このサイトでは、HTTP/1.1のChunked Transfer形式でJSONデータのレスポンスが行われます。 Chunked Transfer形式では、メッセージボディがいくつかのChunk(かたまり)に分割されます。 各チャンクは、チャンクのサイズを16進数で表した行と、チャンクの中身から構成されます。