HTML \ DOM仕様でハイパーリンクがAcceptヘッダーを設定できないのはなぜですか?


10

Acceptクライアントからのヘッダーの目的は、サーバーが要求への応答として受け入れるデータの種類を通知することです。このヘッダーは、JavaScriptの非同期HTTP呼び出しで設定できますが、HTMLでは設定できません。

たとえば、のようなリンクを考えてみましょう<a href="https://softwareengineering.stackexchange.com/some/resource">Get as CSV</a>。のような属性accept="text/csv"が許可されていて、ブラウザAccept: text/csvがそのリクエストと共にヘッダーを送信すると解釈した場合、サーバーはリクエストのセマンティクスに応答できます。それがなければ、などのリンクを作成する可能性が<a href="https://softwareengineering.stackexchange.com/some/resource?format=csv">Get as CSV</a>あり、サーバーは代わりに任意のクエリ文字列パラメーターに応答する必要があります。

Acceptマークアップによるヘッダーの設定を許可しないHTML \ DOM仕様の背後にある技術的および歴史的な理由は何ですか?


2
Webはレガシープラットフォームであり、変更の恐れと遅い標準化委員会によって妨げられています:wtfhtmlcss.com wtfjs.com
Den

回答:


9

ヘッダーはURLの一部ではないためです。URLは、それ自体でリソースを識別し、一意に行う必要があります。Accept(そしてより有用Accept-Encoding)ヘッダは、要求の意味論に影響を与えるべきではありません。サーバーがそれに応じて応答をフォーマットできるように、クライアントの機能を示す必要があります

JavaScriptからHTTP呼び出しを行う場合、JavaScriptコードがクライアントであるため、ヘッダーを設定します。ただし、HTMLリンクの場合、ブラウザはクライアントであり、したがって選択することができます。

CSVをユーザーに提供する場合、リンクされたリソースは通常、固定形式である必要があります。ユーザーが行うことを想像してください

Copy Link Address

$ wgetPasteEnter

それは、さまざまな理由で彼らが行うのが正当なことです。そして、リンクがCSVを約束したので、それは彼らが期待することです。しかし、wgetはリンクの他の属性を取得しません。URLのみ。したがって、情報はURLにエンコードする必要があります。

実際Accept、ほとんどのリソースにはフォーマットがあり、別のリソースではあまり意味がないため、ヘッダーの使用法は多くありません。Accept-Encoding便利です。クライアントは言うならばAccept-Encoding: gzip,deflate、それは、クライアントが行うことができることを意味透明解凍を。しかし、私が考えることができる唯一の使用法についてAcceptは、画像やビデオのフォーマットimage/svg+xmlなどvideo/webmです。ブラウザーがサポートするメディア形式を実際にアドバタイズしていないように見えるため、機能しません。そしてHTMLはとにかく、少しだけ柔軟な別のメカニズムを実装することを選択しました。そして、他のいくつかの種類のデータには、広く実装されたいくつかの代替フォーマットがあり、そこから選択できます。


さらに、オーディオとビデオにはaudioおよびvideoタグがあります。そのため、この問題は(うまくいけば)修正されるまで緩和されます。まあ、HTML5互換のブラウザのために。
パルティアンショット

@ParthianShot:はい。私はウェブアプリをしていないので、それがどのように機能するか覚えていませんでした。クライアントがサポートするすべてのものをリストするよりも、クライアントが選択できるリスト(通常は短い)を提供する方が明らかに適切です。
Jan Hudec、2014

URLはリソースを識別する必要があります。これがまさに、ユーザーがクリックしたときの場所や以前にどこかにリダイレクトされた場合など、ユーザー情報の追跡に役立つパラメーターをヘッダーとして追加したかった理由です。この?
サンティアゴアリツィー

3

のでAccept:、ヘッダは、文書の種類を示すことを意図しているユーザーのブラウザが正しく処理することができ、これはあなたが、ウェブページの著者として、持っている情報ではありません。

具体的には、HTTPプロトコルがAccept:ヘッダーを提供するのは、同じドキュメントが複数のフォームで利用できる場合に適切なファイルタイプを選択できるようにするためです。たとえば、画像にリンクしているとします。私のブラウザはJPEGまたはTiff画像を表示できる場合がありますが、RAW画像を表示する機能がない場合があります。ブラウザは、画像リクエストとともに次のヘッダーを送信することでこれを示します。

Accept: image/jpeg,image/tiff

これで、サーバーが特定の画像をRAWまたはTIFFとして提供できる場合、画像のTIFFバージョンで応答します(Content-Type:選択したタイプを示すようにヘッダーを設定します)。

ブラウザが送信する選択肢をWebページの作成者が上書きするとはどういう意味ですか?私は架空の追加した場合accept="image/raw"の属性を、ブラウザがなり、まだ生の画像を表示することができない-しかし、サーバーは、それを送信します。


ビンゴ。アプリは、ブラウザーが受け入れるMIMEタイプを決定できません。
svidgen 14

2

A URIを特定することを意図しているリソースを

リソースとは、取得される実際のものを指します。ウェブサイトでは、通常はページです。REST APIでは、通常、エンティティ、人物、プロフィール、ウィジェット、写真などです。

HTTPヘッダーはサーバーにクライアントについての情報を伝えます -それらリソース自体については何も記述しておらず、そのリソースを見つけるためのヘルプも提供していません

例えば:

  • Accept-Encoding クライアントが特定のコンテンツを変換または解凍する方法を知っていることをサーバーに伝えます。
  • Accept-Language クライアントが特定のロケールにあることをサーバーに通知し、そのロケールのコンテンツを優先します。
  • Authorization 保護されたリソースへのアクセスが許可されているとクライアントが考えていることをサーバーに通知します。

これらの要求ヘッダーの大部分に共通するテーマは、サーバーがそれらを尊重する義務がないことです。Accept-Encodingのは、gzip応答が圧縮されることを保証するものではありません。の一部Accept-Languageur-PK、ウルドゥー語を特にサポートしていない限り、米国のサイトにアクセスしても無視される可能性があります。また、サーバーは、Authorizationヘッダーが正しいかどうかを確認し、表示が適切でない場合は401または403を返す権利を留保します。

これらのヘッダーはいずれも、サーバーが応答として提供するリソースについての実質的な変更を意図したものではありません。Acceptヘッダは、違いはありません。クライアントが指定application/xmlし、サーバーがのみをサポートするapplication/json場合、サーバーはXMLではなくJSONを送り返します。さらに重要なことは、Acceptヘッダーで複数のタイプを指定できることです。その場合、サーバーは自由に(またはそれらのいずれも)返すことができます。ご想像のとおり、これはユーザーにとって未定義の動作に簡単につながる可能性がありますが、当面は無視してください。

ハイパーリンクの目的は、特定のタイプのリソースであるページリンクすることです。あるいは、リソースがページ以外の何か(おそらく画像やデータセット)であっても、リソースに単純にリンクするというより緩い定義で正当化される場合があります。ただし、これが明らかに意図していないことは、リソースの特定の表現へのリンクです。これは、クライアントとサーバーがネゴシエートし、サーバーが最終的に決定するためのものです。

Accept-Languageハイパーリンクでヘッダーを制御できるようにすることが問題になる理由の明白な例です。考えてみれば、あまり意味がありません。各ユーザーは自分の言語設定を制御します。オペレーティングシステムやブラウザで設定されています。どのページにアクセスしているかに関係なく、ブラウザーは常に同じ Accept-Languageヘッダーを送信する必要があります。サーバーがその言語をサポートしている場合、すばらしいです。そうでない場合は、最も近いと思われる言語で応答します。

ハイパーリンクによってこれが変更される可能性がある場合、ブラウザーとオペレーティングシステムがその言語をサポートするように構成されていない場合でも、着信リンクによってサイトの中国語バージョンに強制的に移動できます。それは意味がありません。サイトが英語をサポートし、ブラウザが英語の場合、ハイパーリンクの内容に関係なく、英語で応答するはずです。

同様に、ブラウザーがXMLを構造化データとして表示する方法を知っていて、XSLを探して見栄えをよくすることができるが、JSONをどうするかわからない場合は、プレーンテキストとしてダンプしてから、リンクを介したJSONコンテンツ(そのようなことが可能である場合)は、積極的にユーザーに敵対的な行動です。「Xを表示する方法は知っているが、Yは知らないので、ブラウザは常にXを提供してくれればいいのに」と言うべきです。

ブラウザーのユーザーがこの決定をオーバーライドできるようにするのが論理的であると考える理由が理解できます。しかし、問題の真実は、あなたがレポートのダウンロードのようないくつかの小さなエッジケースを考えているということです。99%の確率で、この選択が存在する場合、ユーザーは資格を持たないか、それを行うための十分な情報を持っていません。

少し言い方を変えると、両親や祖父母がファイルをダウンロードしようとしていて、text / csvまたはtext / plainを選択するように求められているところを想像してみてください。彼らは違いを知っている可能性がありますか?私はあなたのことを知りませんが、バナー広告とエラーメッセージの違いを見つけることさえできないことがよくあります。そのため、彼らがこの選択をインテリジェントに行うことはできません。一方、「Excelワークブック」または「テキストのみ」をダウンロードするための個別のリンクが与えられている場合、希望がかすかに見える可能性があります。これらは、同じリソースの異なる表現ではなく、実際には個別のリソースです。 URIはそれを反映する必要があります。

ユーザーは、これらの2つが実際には同じリソースであり、表現が異なることを理解することはできません。そして、今日のWebの動作に関するすべてを変更することなく、そのハイパーリンクで何が行われるかについては何も推測できません。クリックするか、右クリックして[名前を付けて保存]を選択するか、コピーしてアドレスバーに貼り付けるか、ダウンロードマネージャーを使用しているか、IE6を使用しているか、または独自のブラウザを備えたブランド外のタブレットまたはモバイルデバイスを使用している可能性があります...これらの多くの場合、宣言したハイパーリンクの一部が失われるため、必要なコンテンツを取得できません。 content-type、またはブラウザはそれをサポートしません。

HTML仕様は、ハイパーリンクのコンテンツタイプ属性をサポートするように40年前に設計されたのでしょうか。たぶん、最初のいくつかの段落で説明したように、特に帯域幅とサーバーリソースが不足していて、同じレポートを複数の形式(または率直に言うと、すべてのレポートをダウンロードする)正直に言って誰にも起こりませんでした。しかし、確かに今日の世界では、そのようなものを仕様に追加するのはおかしいでしょう。それは完全に下位互換性を壊し、すべての既存のブラウザで恐ろしい「未定義の動作」を引き起こします。


クライアントがapplication / xmlを指定し、サーバーがapplication / jsonのみをサポートしている場合、サーバーはXMLではなくJSONを送り返します。次に、406 HTTPエラーは何ですか?rfc2616を引用するには:Acceptヘッダーフィールドが存在し、サーバーが結合されたAcceptフィールド値に従って受け入れ可能な応答を送信できない場合、サーバーは406(受け入れられない)応答を送信する必要があります(SHOULD)。
Jules Randolph

ただし、これが明らかに意図していないことは、リソースの特定の表現へのリンクです。これは、クライアントとサーバーがネゴシエートし、サーバーが最終的に決定するためのものです。→そして、アプリケーション設計者が交渉に参加したい場合はどうなりますか?ユーザーエージェント、つまりクライアントWebブラウザーでなければならず、Webブラウザーだけであると主張されている参照はありますか?これを理解していただけると助かります。
Jules Randolph

0

主な答えは、WebページのリンクはWebページとしてレンダリングされることを目的としています。Webサーバーがレンダリング可能なページ以外のタイプ(画像、ダウンロードしたファイルなど)を返す場合、コンテンツはブラウザーによってレンダリングされるかどうか(ファイルとして保存される可能性があります)。

CSSファイルやJavaScriptファイルなどにつながるWebページ内のリンクをブラウザで適切にレンダリングする方法はありません。

あなたが達成しようとしていることは何でも達成するために(あなたは言わなかった)、必要な追加機能を提供するJavaScript関数を呼び出すリンクを作成できます。


0

理由は本当に簡単です。

ブラウザ

Acceptsヘッダは、私が受け入れて、ファイル/ファイルこのタイプのコンテンツを表示する方法を知っているサーバーに言っている....

Javascript

リクエストをJavaScriptで送信するときにヘッダーを変更できるのは、acceptこの新しいコンテンツタイプが何かを暗号化し、それをファイルタイプとして送信する方法を作成してencrypted/myencryption、JavaScriptがそれを復号化する方法を知っているため、それを受け入れることができるためです。コンテンツのタイプなので、サーバーにそのコンテンツを受け入れることができることを伝える必要があります

アンカーリンク <a></a>

ブラウザーにhref内のファイルを取得してレンダリングするように指示するだけなので、ブラウザーがそれを理解できない場合は、ファイルを解析してファイルのダウンロードプロンプトを表示しようとしました。一部のサーバーは、タイプをtext / plainに設定するだけでこれを回避し、ブラウザはファイルのテキストを表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.