HTTPクライアントの実装
前述の通り、HTTP/1.0のRFCには膨大なルールが定められていますが、リクエストは比較的簡単に送れることが確認できました。 まずはHTTPクライアントとして、基本的なHTTPリクエストをサーバーに送信するプログラムを実装してみることにしましょう。
エディタに以下のプログラムを入力しましょう。
import processing.net.*;
Client client = new Client(this, "virgo.is.chs.nihon-u.ac.jp", 80);
client.write("GET /~onoue/hello.txt HTTP/1.0\r\n");
client.write("\r\n");
while (client.active()) {
if (client.available() > 0) {
String response = client.readString();
print(response);
}
}
基本的にはEchoクライアントと同じ形式です。 最初にWebサーバーへのコネクションを確立し、HTTPに従ってリクエストメッセージを送信しています。
正常に実行できると以下のように表示されるでしょう。
Client got end-of-stream.
HTTP/1.1 200 OK
Date: Thu, 19 Dec 2019 18:47:27 GMT
Server: Apache
Last-Modified: Tue, 09 Oct 2018 07:08:28 GMT
Accept-Ranges: bytes
Content-Length: 6
X-Content-Type-Options: nosniff
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
Connection: close
Content-Type: text/plain; charset=UTF-8
hello
現在はヘッダーもメッセージボディも全てコンソールに表示しています。 さらにこれを改良して、メッセージボディだけを取り出して画面に描画するようにしてみましょう。
プログラムを以下のように修正します。
import processing.net.*;
size(400, 400);
Client client = new Client(this, "virgo.is.chs.nihon-u.ac.jp", 80);
client.write("GET /~onoue/hello.txt HTTP/1.0\r\n");
client.write("\r\n");
String response = "";
while (client.active()) {
if (client.available() > 0) {
response += client.readString();
}
}
int bodyStart = response.indexOf("\r\n\r\n") + 4;
String body = response.substring(bodyStart);
background(255);
fill(0);
textAlign(CENTER, CENTER);
text(body, width / 2, height / 2);
今度は、サーバーから受信したレスポンスを全て文字列変数 response
に格納しています。
全てのメッセージを受信し終えるとコネクションが切断されるため、その後にメッセージボディの取り出しを行います。
ヘッダーとメッセージボディの間は1行の空行で区切られるので、「 \r\n\r\n
」という部分文字列が現れた次の文字以降がメッセージボディになります。
そこで、メッセージボディの開始位置を response.indexOf("\r\n\r\n") + 4
で取得し、response.substring(bodyStart)
でメッセージボディを取得しています。