§結果の操作
§デフォルトのContent-Type
の変更
結果のコンテンツタイプは、レスポンスボディとして指定したJavaの値から自動的に推測されます。
たとえば
Result textResult = ok("Hello World!");
は、Content-Type
ヘッダーをtext/plain
に自動的に設定し、一方
JsonNode json = Json.toJson(object);
Result jsonResult = ok(json);
は、Content-Type
ヘッダーをapplication/json
に設定します。
これは非常に便利ですが、変更したい場合もあります。結果に対してas(newContentType)
メソッドを使用して、異なるContent-Type
ヘッダーを持つ新しい類似の結果を作成するだけです。
Result htmlResult = ok("<h1>Hello World!</h1>").as("text/html");
または、さらに良いのは、
Result htmlResult = ok("<h1>Hello World!</h1>").as(MimeTypes.HTML);
§HTTPヘッダーの操作
HTTPヘッダーを結果に追加(または更新)することもできます。
public Result index() {
return ok("<h1>Hello World!</h1>")
.as(MimeTypes.HTML)
.withHeader(CACHE_CONTROL, "max-age=3600")
.withHeader(ETAG, "some-etag-calculated-value");
}
HTTPヘッダーを設定すると、元の結果に存在していた場合、以前の値が自動的に破棄されることに注意してください。
§クッキーの設定と破棄
クッキーはHTTPヘッダーの特別な形式にすぎませんが、Playはそれを簡単にするための一連のヘルパーを提供します。
以下を使用して、HTTPレスポンスにCookieを簡単に追加できます
public Result index() {
return ok("<h1>Hello World!</h1>")
.as(MimeTypes.HTML)
.withCookies(Cookie.builder("theme", "blue").build());
}
パス、ドメイン、有効期限、セキュアかどうか、HTTP Onlyフラグを設定する必要があるなど、詳細を設定する必要がある場合は、オーバーロードされたメソッドを使用できます。
public Result index() {
return ok("<h1>Hello World!</h1>")
.as(MimeTypes.HTML)
.withCookies(
Cookie.builder("theme", "blue")
.withMaxAge(Duration.ofSeconds(3600))
.withPath("/some/path")
.withDomain(".example.com")
.withSecure(false)
.withHttpOnly(true)
.withSameSite(Cookie.SameSite.STRICT)
.build());
}
Webブラウザーに以前に保存されたCookieを破棄するには
public Result index() {
return ok("<h1>Hello World!</h1>").as(MimeTypes.HTML).discardingCookie("theme");
}
クッキーを設定するときにパスまたはドメインを設定した場合は、クッキーを破棄するときに同じパスまたはドメインを設定してください。ブラウザーは、名前、パス、ドメインが一致する場合にのみ破棄します。
§テキストベースのHTTPレスポンスの文字セットの変更
テキストベースのHTTPレスポンスでは、文字セットを正しく処理することが非常に重要です。Playはこれを処理し、デフォルトでutf-8
を使用します(utf-8を使用する理由を参照)。
文字セットは、テキストレスポンスをネットワークソケット経由で送信するための対応するバイトに変換し、適切な;charset=xxx
拡張子でContent-Type
ヘッダーを更新するために使用されます。
エンコーディングは、Result
値を生成するときに指定できます。
public Result index() {
return ok("<h1>Hello World!</h1>", "iso-8859-1")
.as("text/html; charset=iso-8859-1");
}
§範囲結果
Playは、範囲リクエストと部分レスポンスの動作を定義するRFC 7233の一部をサポートしています。これにより、リクエストに満たすことのできるRange
ヘッダーが存在する場合に、206 Partial Content
を配信できます。また、配信されたResult
に対してAccept-Ranges: bytes
を返します。
注:複数の範囲をより適切に処理するためにいくつかの解析が行われますが、
multipart/byteranges
はまだ完全にサポートされていません。
範囲結果は、Source
、InputStream
、File、およびPath
に対して生成できます。利用可能なすべてのメソッドについては、RangeResult
APIドキュメントを参照してください。例:
public Result index(Http.Request request) {
String content = "This is the full content!";
InputStream input = getInputStream(content);
return RangeResults.ofStream(request, input, content.length());
}
または、Source
の場合
public Result index(Http.Request request) {
String content = "This is the full content!";
Source<ByteString, NotUsed> source = sourceFrom(content);
return RangeResults.ofSource(
request, (long) content.length(), source, "file.txt", MimeTypes.TEXT);
}
リクエストのRange
が満たせない場合、たとえば、リクエストのRange
ヘッダーフィールドの範囲が選択されたリソースの現在の範囲と重複しない場合は、HTTPステータス416
(Range Not Satisfiable)が返されます。
また、範囲結果をより効率的に配信するために、Source
の特定の場所を事前にシークすることも可能です。そのためには、事前シークが発生する関数を指定できます。
public Result index(Http.Request request) {
String content = "This is the full content!";
return RangeResults.ofSource(
request,
(long) content.length(),
offset ->
new RangeResults.SourceAndOffset(offset, sourceFrom(content).drop(offset)),
"file.txt",
MimeTypes.TEXT);
}
このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。 ドキュメントガイドラインをお読みになった後、プルリクエストを自由に貢献してください。質問や共有するアドバイスがありますか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。