UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【WebAPI】URIの2つの仕様

ある検索フォームを実装したところQAの人から「? 」を含むキーワードの検索がおかしいと指摘があった

すぐにURIエンコードが必要だとわかってencodeURIComponentを使ってキーワードをエンコードしてOKが出たのだが「他の記号は大丈夫なんでしょうか?」という質問をされた

developer.mozilla.org

WEB標準APIを使っているので大丈夫だと返答しようとしたが、上記のMDNのドキュメントに

エスケープされないもの:

    A-Z a-z 0-9 - _ . ! ~ * ' ( )

という一文があり、返答する前に調べることにした

wikipediaが目に入ったのでみてみると

とあるので、! ' ( ) *予約語にもかかわらずエスケープされないことになる

MDNのドキュメントにあるようにURIの使用は2つあって

RFC2396(1998年発行)
RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax

RFC 3986(2005年発行)
RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax

encodeURIComponentはRFC2396に準拠しているらしい

なので、パースするサーバー側がどちらの仕様に準拠しているかで、encodeURIComponentのままでよいかどうかが変わる

RFC 3986にも準拠する場合は以下を実装する必要がある

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

結果、対応不要でよかったが調べといてよかった

参考

freak-da.hatenablog.com