§結果の操作
§デフォルトの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);
}このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。 ドキュメントガイドラインをお読みになった後、プルリクエストを自由に貢献してください。質問や共有するアドバイスがありますか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。