ネットワークを介したデータ取得の基本
前回の記事では、Javaプログラミングの基礎と、簡単なプログラムの作成方法について学んだね。今回は、その知識を活かして、インターネット上のデータにアクセスする方法、つまりHTTP通信について解説していくよ。
インターネットでウェブサイトを見たり、アプリで天気予報をチェックしたりするとき、裏側では「HTTP通信」というものが動いているんだ。HTTPは「Hypertext Transfer Protocol」の略で、ウェブブラウザとウェブサーバーの間で情報をやり取りするためのルール(プロトコル)のことだよ。
簡単に言うと、君がウェブサイトを見たいとき、君のパソコン(クライアント)がウェブサーバーに「このページの情報をちょうだい!」とお願いする。するとサーバーは「はい、どうぞ!」とその情報を送り返す。このやり取りがHTTP通信なんだ。
URLの役割
ウェブサイトのアドレスを普段「URL」と呼んでいるよね。これは「Uniform Resource Locator」の略で、インターネット上のどこに情報があるかを指し示す住所のようなものなんだ。
たとえば、https://www.google.com/search?q=Java というURLを見てみよう。
https://:これは「スキーム」と呼ばれる部分で、どのような方法で通信するかを示しているよ。httpsはhttpにセキュリティ機能を追加したもので、データの暗号化が行われるから、安全に通信できるんだ。www.google.com:これは「ホスト名」と呼ばれる部分で、どのサーバーにアクセスするかを示しているよ。人間が覚えやすいように文字で書かれているけど、実際には数字のIPアドレスに変換されて使われているんだ。/search:これは「パス」と呼ばれる部分で、サーバーの中のどのリソース(ファイルやデータ)にアクセスするかを示しているよ。?q=Java:これは「クエリパラメータ」と呼ばれる部分で、サーバーに送る追加情報を表しているよ。この例だと「Java」というキーワードで検索してね、という情報になるね。
URLは、HTTP通信において「どこに、何を、どのように要求するか」を具体的に示す、とても重要な情報なんだ。
HttpURLConnectionを使ってみよう
JavaでHTTP通信を行うには、標準で用意されているHttpURLConnectionというクラスを使うのが一般的だよ。これを使うと、ウェブサーバーからデータを取得したり、データを送信したりできるんだ。
今回は、簡単な例として、特定のURLからウェブページのHTMLデータを取得する方法を見てみよう。
Java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class SimpleHttpExample {
public static void main(String[] args) {
try {
// ① 接続したいURLを指定する
URL url = new URL("https://moritama321.hatenablog.com/"); // 前回の記事へのリンク
// ② URL接続オブジェクトを作成する
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// ③ HTTPメソッドを設定する(今回はGETメソッドでデータを取得)
connection.setRequestMethod("GET");
// ④ 接続を開始し、レスポンスコードを取得する
int responseCode = connection.getResponseCode();
System.out.println("レスポンスコード: " + responseCode);
// ⑤ レスポンスコードが200(成功)だったら、データを読み込む
if (responseCode == HttpURLConnection.HTTP_OK) {
// サーバーからの入力ストリームを開く
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer content = new StringBuffer();
// 1行ずつデータを読み込み、StringBufferに追加していく
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close(); // ストリームを閉じる
// 取得したコンテンツを表示する(ここでは一部を抜粋)
System.out.println("取得したコンテンツの一部:");
System.out.println(content.substring(0, Math.min(content.length(), 500))); // 最初の500文字を表示
} else {
System.out.println("データの取得に失敗しました。");
}
// ⑥ 接続を閉じる
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
このコードを上から順に見ていこう。
- URLの指定: 最初に、アクセスしたいURLを
URLクラスのオブジェクトとして作成するよ。ここでは、前回の記事のURLを指定しているね。 - 接続オブジェクトの作成:
url.openConnection()を呼び出すことで、指定したURLへの接続を管理するためのURLConnectionオブジェクトが返されるんだ。HTTP通信なので、これをHttpURLConnection型にキャスト(変換)するよ。 - HTTPメソッドの設定:
setRequestMethod("GET")で、HTTPの「GET」メソッドを使うことを指定しているよ。GETメソッドは、サーバーからデータを取得するときに使う一番基本的なメソッドなんだ。他にも、データを送信するときに使う「POST」メソッドなどがあるよ。 - 接続とレスポンスコードの取得:
connection.getResponseCode()を呼び出すと、実際にサーバーに接続が行われ、サーバーからの応答(レスポンス)のコードが返ってくるよ。200は「OK、成功しました!」という意味で、よく見るコードだね。 - データの読み込み: レスポンスコードが
200だったら、connection.getInputStream()を使って、サーバーから送られてきたデータを受け取るためのストリームを開くよ。BufferedReaderとInputStreamReaderを使って、そのデータを効率的に1行ずつ読み込んでいるんだ。読み込んだデータはStringBufferにどんどん追加していくよ。 - 接続を閉じる: 最後に
connection.disconnect()を呼び出して、サーバーとの接続を閉じるんだ。これは、使い終わったリソースを解放するために重要だよ。
このプログラムを実行すると、指定したURLのウェブサイトのHTMLデータの一部がコンソールに表示されるはずだよ。
エラーハンドリングについて
上記の例ではtry-catchブロックを使って、通信中に発生するかもしれないエラー(例外)を処理しているよ。ネットワーク通信は、接続が不安定だったり、サーバーが見つからなかったり、さまざまな問題が発生する可能性があるんだ。
たとえば、存在しないURLにアクセスしようとすると、java.net.UnknownHostExceptionなどの例外が発生する可能性があるよ。try-catchを使ってこれらの例外を適切に処理することで、プログラムが途中で予期せず終了してしまうのを防ぎ、ユーザーにエラーを知らせることができるんだ。
データの送信(POSTメソッド)
今回はデータの取得(GETメソッド)について触れたけど、HttpURLConnectionを使えば、サーバーにデータを送信することもできるよ。例えば、ウェブサイトのフォームに入力した内容をサーバーに送るときなどに使うんだ。
データの送信には主に「POST」メソッドが使われることが多いよ。GETメソッドがURLにデータを付けて送るのに対して、POSTメソッドはリクエストの「ボディ」と呼ばれる部分にデータを格納して送るんだ。
Java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class SimpleHttpPostExample {
public static void main(String[] args) {
try {
URL url = new URL("https://example.com/api/post_data"); // データを送信するURL(架空のURL)
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// POSTメソッドを設定
connection.setRequestMethod("POST");
// データを書き込むことを許可する
connection.setDoOutput(true);
// 送信するデータ(JSON形式の例)
String jsonInputString = "{\"name\": \"Alice\", \"age\": 30}";
// リクエストヘッダーを設定(Content-Typeは送信するデータの形式を示す)
connection.setRequestProperty("Content-Type", "application/json; utf-8");
connection.setRequestProperty("Accept", "application/json"); // サーバーからの返答形式を指定
// データを書き込む
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
int responseCode = connection.getResponseCode();
System.out.println("レスポンスコード: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) {
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
StringBuilder response = new StringBuilder();
String responseLine = null;
while ((responseLine = in.readLine()) != null) {
response.append(responseLine.trim());
}
System.out.println("サーバーからの応答: " + response.toString());
} else {
System.out.println("データの送信に失敗しました。");
// エラーレスポンスの読み込み(必要であれば)
BufferedReader errorIn = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
String errorLine;
StringBuilder errorResponse = new StringBuilder();
while ((errorLine = errorIn.readLine()) != null) {
errorResponse.append(errorLine.trim());
}
System.out.println("エラー詳細: " + errorResponse.toString());
}
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
この例では、JSON形式のデータをサーバーに送信しているよ。ポイントは、connection.setDoOutput(true);でデータの書き込みを許可し、OutputStreamを使ってデータを書き込んでいるところだね。setRequestPropertyで「Content-Type」を設定しているのは、サーバーに「今からJSON形式のデータを送りますよ」と教えてあげているんだ。
まとめ
今回は、JavaでHTTP通信を行うための基本として、URLの構造と、HttpURLConnectionを使ったデータの取得(GETメソッド)と送信(POSTメソッド)について解説したよ。
- HTTP通信は、インターネット上で情報をやり取りするためのルールだよ。
- URLは、インターネット上の情報がどこにあるかを示す住所だよ。
- HttpURLConnectionは、JavaでHTTP通信を行うための便利なクラスだよ。
- データを取得するときは主にGETメソッド、データを送信するときは主にPOSTメソッドを使うよ。
これで、君もJavaを使ってインターネット上のデータにアクセスする第一歩を踏み出せたね!
前回の記事はこちらから読めるよ: ToolDocs | 様々なツールや技術情報を紹介します


コメント