[519] [DFN[[CODE(HTTP)[[[204]]]]]] ([DFN[[[No Content]]]]) は、処理が成功したことと、 [[payload body]]
が無いことを表す[[状態符号]]です。

* 仕様書

[REFS[
- [512] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-6.3.5>'''
- [205] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-3.3>
- [507] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-4.3.4>
- [215] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-4.3.5>
- [4] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.6>
- [5] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.8>
- [8] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.9>
- [11] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.10>
- [9] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.11>
]REFS]

* 意味

[513] [CODE(HTTP)[[[204]]]] は、[[鯖]]が[[要求]]を成功裏に満足し、
[[応答]]の [[payload body]] に入れて送信する追加情報はないことを示します。 [SRC[>>512]]

[514] [[応答ヘッダー]]の[[メタデータ]]は[[対象資源]]と、
[[要求]]された動作の適用後の選択された[[表現]]についてのものです。 [SRC[>>512]]

[EG[
[515] 例えば [CODE(HTTP)@en[[[PUT]]]] [[要求]]に [CODE(HTTP)[[[204]]]]
[[応答]]が返され [CODE(HTTP)@en[[[ETag:]]]] [[ヘッダー]]が含まれている場合、
[CODE(HTTP)@en[[[PUT]]]] が成功だったことを表し、
[CODE(HTTP)@en[[[ETag:]]]] の値は[[対象資源]]の新しい[[表現]]の[[実体タグ]]となります [SRC[>>512]]。
]EG]

* 構文

[206] [CODE(HTTP)[[[204]]]] [[応答]]は、[[メッセージ本体]]を持ちません [SRC[>>205]]。
[[ヘッダー]]の後の最初の[[改行]]で[[メッセージ]]が終わります [SRC[>>12]]。

* 文脈

[511] [[起源鯖]]は、[[対象資源]]が現在[[表現]]を持っており、 [CODE(HTTP)@en[[[PUT]]]]
によりその編集に成功した場合には、 [CODE(HTTP)[[[200]]]] か [CODE(HTTP)[[[204]]]]
を送信しなければ[['''なりません''']] [SRC[>>507]]。

[218] [[起源鯖]]は、処理が成功した場合には、
処理が成功するであろうものの実施されていない場合には [CODE(HTTP)[[[202]]]] を、
実施され追加情報は特に無い場合には [CODE(HTTP)[[[204]]]] を、
実施され[[応答メッセージ]]に状態を説明する[[表現]]を含める場合には [CODE(HTTP)[[[200]]]]
を返す[['''べきです''']] [SRC[>>215]]。

[6] [CODE(HTTP)@en[[[COPY]]]] [[要求]] [SRC[>>5]] や [CODE(HTTP)@en[[[MOVE]]]]
[[要求]] [SRC[>>8]] によって既存の終点[[資源]]が上書きされた場合には、
[CODE(HTTP)[[[204]]]] [[応答]]を返します。

[7] [CODE(HTTP)@en[[[DELETE]]]] [[要求]]に対する [CODE(HTTP)[[[207]]]]
[[応答]]内の [CODE(XMLe)@en[[[status]]]] [[要素]]では使う[['''べきではありません''']]
[SRC[>>4]]。

[10] [CODE(HTTP)@en[[[ULOCK]]]] [[要求]]が成功した場合、
[CODE(HTTP)[[[204]]]] [[応答]]を返すことができます。
[CODE(HTTP)[[[200]]]] より [CODE(HTTP)[[[204]]]] が適切です。 [SRC[>>9]]

[12] [[LER]] は [CODE(HTTP)[[[204]]]] を返すことができます [SRC[>>11]]。

[3] [CODE(HTTP)@en[[[Prefer:]] [[return]]=[[minimal]]]] が指定された場合の[[応答]]としても利用できます。

* 処理

[516] [[利用者エージェント]]は[[利用者]]に適当な方法で成功を示し、
また新規や更新された[[メタデータ]]が含まれていれば
[WEAK[([[利用者エージェント]]が保持している[[キャッシュ]]などの)]] [[表現]]にも適用することが期待されています
[SRC[>>512]]。

[EG[
[517] 例えば[[文書]]を編集していて「[[保存]]」する時に、
保存しつつ[[利用者]]がそのまま編集を継続できるようにするために
[CODE(HTTP)[[[204]]]] が使われます [SRC[>>512]]。
]EG]

[518] [CODE(HTTP)[[[204]]]] [[応答]]は、[[キャッシュ可能]]です [SRC[>>512]]。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[207] RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 10.2.5 204 No Content
]FIGCAPTION]

> The server has fulfilled the request but [DEL[[INS[{1945,2068}]] there is no new information to send back]] [INS[[INS[{2616}]] does not need to return an entity-body, and might want to return updated metainformation]]. [DEL[[INS[{1945,2068}]] If the client is a user agent, it [DEL[[INS[{1945}]] should not]] [INS[[INS[{2068}]] SHOULD NOT]] change its document view from that which caused the request to be [DEL[[INS[{1945}]] generated]] [INS[[INS[{2068}]] sent]]. This response is primarily intended to allow input for [DEL[[INS[{1945}]] scripts or other]] actions to take place without causing a change to the user agent's active document view.]]
The response [DEL[[INS[{1945}]] may]] [INS[[INS[{2068}]] MAY]]
include new [INS[[INS[{2616}]] or updated]] metainformation in the form of [DEL[[INS[{1945}]] entity headers]] [INS[[INS[{2068,2616}]] entity-headers]], which [DEL[[DEL[[INS[{1945}]] should]] [INS[[INS[{2068}]] SHOULD]] [INS[{1945,2068}]] apply to the document currently in the user agent's active view]] [INS[[INS[{2616}]] if present SHOULD be associated with the requested variant]].

サーバーは要求を満たしましたが、[DEL[送り返すあたらしい情報はありません]] [INS[[CODE(ABNF)[[[entity-body]]]] を返す必要はなく、更新されたメタ情報を返すことを望んでいるかもしれません]]。
応答は新規の[INS[又は更新された]]メタ情報を実体頭欄の形で含んでいても'''よく'''、[INS[示されている場合は要求した変種と関連付けられる'''べきです'''。]]。

[INS[
> [INS[{2616}]] If the client is a user agent, it SHOULD NOT change its document view
from that which caused the request to be sent. This response is
primarily intended to allow input for actions to take place without
causing a change to the user agent's active document view, although
any new or updated metainformation SHOULD be applied to the document
currently in the user agent's active view.

クライアントが利用者エージェントであれば、
要求を送ることとした文書表示を変更する'''べきではありません'''。
この応答は主として利用者エージェントの活性文書表示を変更することなく起こる動作の入力を可能とすることを意図しています。
但し、新規の又は更新されたメタ情報は、現在利用者エージェントで活性表示中の文書に適用する'''べきです'''。
]INS]

[INS[
> [INS[{206,2616}]] The 204 response MUST NOT include a message-body, and thus is always
terminated by the first empty line after the header fields.

[CODE(HTTP)[204]] 応答は [CODE(ABNF)[[[message-body]]]] を含んでは'''ならず'''、
従って常に頭欄の後の最初の空行で終端します。
]INS]
]FIG]

* メモ

[1] 駄目駄目な UA は、 204 が返っても読み込み中のままになったりします。

また、例えばボタンの押下によって利用者が画面表示上の変化を期待していそうな場合なんかは、
表示に変化が起こらないとすると利用者が戸惑って何度も押してしまったりするかもしれません。

その辺、資源の著者や UA の作者の配慮でうまく問題を回避して欲しいです。。。

[2] >>1 最低でも、 UA は読み込みを終了して、状態棒にサーバーが要求を受け入れましたみたいなメッセージを出して欲しいですね。


[208] [CITE@en[RFC 7252 - The Constrained Application Protocol (CoAP)]]
( ([TIME[2014-06-27 00:59:37 +09:00]] 版))
<http://tools.ietf.org/html/rfc7252#section-5.9.1.4>

[520] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]]
( ([TIME[2014-06-08 07:17:07 +09:00]] 版))
<http://tools.ietf.org/html/rfc3507#section-4.3.3>

[13] [CITE@en[head :no_content (204 status code) returns error · Issue #510 · Alamofire/Alamofire]]
( ([TIME[2016-07-27 15:25:05 +09:00]]))
<https://github.com/Alamofire/Alamofire/issues/510>

[14] [CITE@en[RFC 7967 - Constrained Application Protocol (CoAP) Option for No Server Response]]
([TIME[2016-09-05 21:25:53 +09:00]])
<https://tools.ietf.org/html/rfc7967>

[15] [CITE@en[RFC 7967 - Constrained Application Protocol (CoAP) Option for No Server Response]]
([TIME[2017-03-05 17:50:48 +09:00]])
<https://tools.ietf.org/html/rfc7967#section-3.4>

[16] [CITE@en[Under-specified: parsing behavior following 204 response · Issue #26 · httpwg/http11bis]]
([TIME[2017-05-26 13:49:36 +09:00]])
<https://github.com/httpwg/http11bis/issues/26>

[17] [CODE[201]] のような意味で [CODE[204]] を使う[[サーバー]]があり、
[CODE[Location:]] に作成された[[資源]]の [[URL]]
を設定するようです。
[TIME[2018-02-09T14:18:04.500Z]]