サーバー上のRESTful APIとHTTPS経由で通信するモバイルデバイスがあります。操作の1つは、オフラインでサーバーに対して行われた変更のプッシュへのデータ同期と、サーバー上で並行して行われた更新のプルダウンです。
その同期操作が既存のクライアントで静かに失敗する可能性があるEdgeのケースに遭遇しました。条件を適切に処理するために、クライアントの「同期プロトコル」をアップグレードしました。理想的には、古いクライアントすべてが同期を試みたときに、アップグレードするように指示するメッセージを受け取るようにしたいと考えています。
通信はサーバーとモバイルクライアントの間で行われるため、任意の数のHTTPコードを返し、将来クライアントにアップグレードして同期プロセスをすぐに停止するようにメッセージを表示するようにクライアントに通知できます。
これを示すために使用するHTTP 426 Upgrade Required戻りコードの意図の粗雑化と見なされますか?すべてのリファレンス( IETF RFC 2817 、 Wikipedia )私は、クライアントにTLSにアップグレードするように通知するためにそれを使用することについて話します。これは、SSLやTLSのような明確に定義された/セキュリティプロトコルに限定されることを意図しているのですか、それとも、従来SSLおよびTLSにのみ使用されてきたHTTPレイヤーの汎用アップグレードフラグですか?
このユースケースを対象としていない場合、HTTP 303 See Otherがより適切であると考えられますか、それとも他のコードがないのですか?
私の1つを引用 以前の回答 :
HTTPアップグレード は、可能であれば、別のバージョンのHTTPまたは別のプロトコルに切り替えるための設定または要件を示すために使用されます。
The Upgrade general-header allows the client to specify what additional communication protocols it supports and would like to use if the server finds it appropriate to switch protocols. The server MUST use the Upgrade header field within a 101 (Switching Protocols) response to indicate which protocol(s) are being switched. Upgrade = "Upgrade" ":" 1#product For example, Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 The Upgrade header field is intended to provide a simple mechanism for transition from HTTP/1.1 to some other, incompatible protocol.
IANA register によると、登録されている言及は3つだけです(HTTP仕様自体に含まれているものを含む)。
他の2つは、
HTTP/1.1内のTLSへのアップグレード (ほとんど使用されていません。 HTTP over TLS と混同しないでください。HTTPSが広く使用されていると定義されています)。このアップグレードでは 他のプロトコルのSTARTTLSと同様のメカニズムの場合 (たとえば、LDAP、SMTPなど)を使用して、一部のポートを交換した後、通常の接続と同じポートでTLSに切り替えることができますTLS(HTTPSのしくみ)の上にあることを知る必要なく、SSL/TLSの上にHTTP全体を交換するのではなく、アプリケーションプロトコルメッセージの.
WebSocketsへのアップグレード (まだ下書き)。
(IANAレジスターはそれ以降変更されていません。)
RFC 2817 で定義されている426応答コードは、RFC 2816で定義されている「HTTPアップグレード」の意味でのアップグレードに明らかに関係しています。これは、の変更点です。現在使用されているレイヤー(つまり、HTTP自体)のcurrentプロトコル。 (http://
からhttps://
へのアップグレードはまったく対象外です。)
HTTPの上で交換されるメッセージ(プロトコルの一部である場合)はこれに含まれません。 HTTPに関する限り、これらは単なるハイパーメディアエンティティです。
ハイパーメディアの意味を変えるのであれば、426は適切ではないと思います。単純な400はおそらくより良い選択でしょう。エラーステータスコード(4xx、5xx)を含む応答は、エンティティを応答に関連付けることを妨げないことに注意してください。これは、クライアントにプロトコルを(そのレベルで)アップグレードするように指示するメッセージがある場所です。
私は426が最良の選択ではないというブルーノに同意します。 400の方が優れていますが、 4 の方が優れています。
10.4.4 403 Forbidden
サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。承認は役に立たず、リクエストは繰り返されるべきではありません。リクエストメソッドがHEADでなく、サーバーがリクエストが満たされていない理由を公開したい場合は、エンティティに拒否の理由を記述してください。サーバーがこの情報をクライアントが利用できるようにするには、代わりにステータスコード404(見つかりません)を使用できます。
Twitter API にはこれに関する先例があります。
2014年2月26日以降、api.Twitter.comはすべての非SSL着信トラフィックに対して403ステータスコードを返します。クライアントコードはこのエラーを処理できる必要があります。