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) でメッセージボディを取得しています。

results matching ""

    No results matching ""