リクエストボディとヘッダー
POST データを送り、ヘッダーを設定します。
「リクエストボディとヘッダー」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
リクエストボディとヘッダー
GETリクエストでボディが必要になることはほとんどありませんが、POST、PUT、PATCHでは必要になります。JDK HTTPクライアントでは、BodyPublisher オブジェクトでリクエストボディを指定し、ビルダーのメソッドでヘッダーを設定します。
このレッスンでは、データの送信と Content-Type などのヘッダーの制御について説明します。
BodyPublishers.ofString
最も簡単なpublisherは、文字列のボディを送信します。リクエストビルダーの POST(...) メソッドに渡します。
ボディのないリクエストには BodyPublishers.noBody() を使えます。
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"Ada\"}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/users"))
.POST(BodyPublishers.ofString(json))
.build();
System.out.println("Method: " + request.method());
}
}単一のヘッダーの設定
ヘッダーを1つ追加するには、header(name, value) を使います。JSONを送信する場合は、ほとんどの場合 Content-Type を設定します。
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
public class Main {
public static void main(String[] args) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/users"))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString("{}"))
.build();
System.out.println("Has Content-Type: " +
request.headers().firstValue("Content-Type").isPresent());
}
}複数のヘッダーを一度に設定
headers(name1, value1, name2, value2, ...) を使うと、1回の呼び出しで複数のヘッダーを設定できます。引数の数が偶数でない場合は IllegalArgumentException がスローされます。
import java.net.URI;
import java.net.http.HttpRequest;
public class Main {
public static void main(String[] args) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.headers(
"Accept", "application/json",
"Accept-Language", "en-US")
.GET()
.build();
System.out.println(request.headers().map().keySet());
}
}Authorizationヘッダー
Bearerトークンは Authorization ヘッダーで送信します。値は文字列として構築し、生のトークンをログに出力してはいけません。
public class Main {
public static void main(String[] args) {
String token = "abc123";
String headerValue = "Bearer " + token;
System.out.println("Authorization: Bearer ***");
System.out.println("Length: " + headerValue.length());
}
}PUTとDELETE
ビルダーには専用のメソッドとして、PUT(publisher)、DELETE()、およびPATCHなどその他のメソッドに使う汎用の method(name, publisher) があります。
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
public class Main {
public static void main(String[] args) {
HttpRequest patch = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/users/1"))
.method("PATCH", BodyPublishers.ofString("{\"active\":true}"))
.build();
System.out.println("Method: " + patch.method());
}
}フォームエンコードされたボディ
application/x-www-form-urlencoded 形式のデータでは、各値をURLエンコードしてからボディ文字列を手動で構築し、文字列として送信します。
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) {
String body = "name=" + URLEncoder.encode("Ada Lovelace", StandardCharsets.UTF_8)
+ "&role=" + URLEncoder.encode("engineer", StandardCharsets.UTF_8);
System.out.println(body);
}
}ファイルボディの送信
BodyPublishers.ofFile(path) は、ファイル全体をメモリに読み込まずにリクエストボディとしてストリーム送信します。アップロードに適しています。
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/upload"))
.header("Content-Type", "application/octet-stream")
.POST(BodyPublishers.ofFile(Path.of("data.bin")))
.build();
System.out.println("Upload request built");
}
}バイト配列のボディ
すでにメモリ上にバイトがある場合は、BodyPublishers.ofByteArray(byte[]) で直接送信できます。実行時に構築したバイナリペイロードに便利です。
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) {
byte[] payload = "raw-bytes".getBytes(StandardCharsets.UTF_8);
// BodyPublishers.ofByteArray(payload) would wrap these bytes
System.out.println("Payload size: " + payload.length + " bytes");
}
}制限されたヘッダー
セキュリティ上の理由から、クライアントでは Host、Content-Length、Connection、Upgrade など特定のヘッダーを設定できません。設定しようとすると IllegalArgumentException がスローされます。これらはクライアント自身が管理します。
組み合わせて実装する
一般的なJSON POSTでは、ボディのpublisherとContent-Typeヘッダーを組み合わせます。
.POST(BodyPublishers.ofString(json)).header("Content-Type", "application/json")- 必要に応じて
.header("Authorization", "Bearer ...")を追加します
理解度チェック
リクエストボディとヘッダーについての理解度を確認しましょう。
まとめ
データの送信とヘッダーの制御方法を学びました。
- BodyPublishers.ofString / ofByteArray / ofFile でリクエストボディを指定します。
- POST / PUT / DELETE / method(...) でHTTPメソッドを選択します。
- header(...) と headers(...) でリクエストヘッダーを設定します。
- JSONやフォームデータには
Content-Typeを設定し、トークンにはAuthorizationを使います。 - 一部のヘッダー(Host、Content-Length)は制限されており、クライアントが管理します。
よくある質問
「リクエストボディとヘッダー」レッスンは無料ですか?
はい。「リクエストボディとヘッダー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「リクエストボディとヘッダー」で何を学びますか?
POST データを送り、ヘッダーを設定します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「リクエストボディとヘッダー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- java.net.http.HttpClient
- 非同期リクエスト
- リクエストボディとヘッダー
- レスポンスの処理