#HTTPでコンテンツ取得
-
HttpClientクラス(Java11以降)
- HTTP2対応
- 非同期処理
- WebSocket通信(軽量)
- モジュール(パッケージの束)
- HttpClientクラスは
java.net.http
モジュールに属する - 現プロジェクトからモジュールへのアクセスを有効化するため/src配下に以下記述
- HttpClientクラスは
module-info.java
module selflearn{
requires java.net.http;
}
-
HttpClientオブジェクト生成
- newHttpClientメソッドでインスタンス生成
- newBuilderメソッドで動作パラメータ設定
- 認証コード(authenticator)、接続タイムアウト時間(connectTimeout)、バージョン指定(version)など
var client = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .connectTimeout(Duration.parse("PT3S")).build();
- 最後にbuild()を呼び出してそれぞれの設定に基づくHttpClientオブジェクト生成
-
HTTPRequestオブジェクト生成
- newBuilderメソッドの最後にbuildメソッド呼び出す
-
リクエスト送信
- HttpClientクラスのsendメソッド
- レスポンス操作のhandlerメソッド指定
- 文字列(ofString)、ストリーム(ofLines)、ファイル(ofFile)、入力ストリーム(ofInputStream)、バイト配列(ofByteArray)
-
レスポンス取得
- sendメソッドは応答をオブジェクトで返す
- 本文(body)、応答ヘッダ(headers)、HttpRequest(request)、ステータスコード(statusCode)、URI(uri)
//Qiitaにアクセスしてコンテンツ取得
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) {
try {
//HTTPクライアント生成
var client = HttpClient.newHttpClient();
//リクエスト準備
var req = HttpRequest.newBuilder()
.uri(URI.create("https://qiita.com/"))
.build();
//レスポンス取得
var res = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
//<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Qiita</title><meta content="Qiitaは、プログラマのための技術情報共有サービスです。 プログラミングに関するTips、ノウハウ、メモを簡単に記録 &amp; 公開することができます。"(略)
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
非同期リクエスト送信
- sendAsyncメソッド
- 応答を待たず後続の処理できる
- thenAcceptメソッドで結果処理
//非同期処理でレスポンス取得
client.send(req, HttpResponse.BodyHandlers.ofString())
.thenAccept(response -> {
System.out.println(response.body());
});
##HTTP POSTのデータ通信
- HTTP GETでデータ取得、HTTP POSTでデータ送信
-
HttpRequest.BodyPublishersクラスのメソッドでリクエスト生成
- 文字列(ofString)、ファイル長さ(ofFile)、InputStream(ofInputStream)、バイト配列(ofByteArray)
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
var client = HttpClient.newHttpClient();
//nameキーを受け取ってString生成
var req = HttpRequest.newBuilder()
.uri(URI.create("https://www.sample/post.php")) //"こんにちは、さん!"
.header("Content-Type","application/json")
.POST(HttpRequest.BodyPublishers.ofString(
"{ \"name\" : \"Qiita Neko\" }"))
.build();
var res = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body()); //こんにちは、Qiita Nekoさん!
}
}
post.php
<?php
$data = json_decode(file_get_contents('php://input'));
print ('こんにちは、'.$data->name.'さん!');