queryStringを解決する

13743 ワード

querystringは文字通りクエリー文字列を意味し,httpリクエストに伴うデータを解析するのが一般的である.Querystringモジュールでは、4つの方法しか提供されていません.
  • querystring.parse
  • querystring.stringify
  • querystring.escape
  • querystring.unescape

  • この4つの方法は対応している.
    まず、querystringモジュールを使用する前に、requireが入る必要があります.
    const querystring = require("querystring");

    次に、モジュールの次の方法を使用できます.
    1 querystring.parse(str,separator,eq,options)
    parseこの方法は、文字列をオブジェクトに逆シーケンス化することです.
    パラメータ:
  • strとは、逆シーケンス化が必要な文字列を指す.
  • separator(省略可能)はstrという文字列を分割するための文字または文字列を指し、デフォルト値は「&」である.
  • eq(省略可能)は、キーと値を区切る文字または文字列を指し、デフォルト値は「=」である.
  • options(省略可能)このパラメータはオブジェクトで、maxKeysとdecodeURIComponentの2つのプロパティを設定できます:
  • maxKeys:numberタイプを入力し、解析キー値ペアの最大値を指定します.デフォルト値は1000です.0に設定すると、解析の数の制限が解除されます.
  • decodeURIComponent:%を含む文字列を復号するfunctionが送信され、デフォルト値はquerystring.unescapeです.公式APIの例では、gbkDecodeURIComponentというメソッドを使用すると、gbkDecodeURIComponent is no definedが表示されます.これは、このgbkDecodeURIComponentというメソッドを使用する前に定義する必要があるためです.APIにもAssuming gbkDecodeURIComponent function already exists…と書かれていますが、このgbkDecodeURIComponentメソッドは既に存在すると仮定します.

  • 例1,querystring.parse
     1 querystring.parse("name=whitemu&sex=man&sex=women");
     2 /*
     3 return:
     4 { name: 'whitemu', sex: [ 'man', 'women' ] }
     5 */
     6 querystring.parse("name=whitemu#sex=man#sex=women","#",null,{maxKeys:2});
     7 /*
     8 return:
     9 { name: 'whitemu', sex: 'man' }
    10 */

    2 querystring.stringify(obj,separator,eq,options)
    stringifyこの方法は、querystring.parseに対してオブジェクトを文字列にシーケンス化することです.
    パラメータ:
  • objとは、シーケンス化が必要なオブジェクト
  • を指す.
  • separator(省略可能)キー値ペアを接続する文字または文字列で、デフォルト値は「&」です.
  • eq(省略可能)キーと値を接続する文字または文字列で、デフォルト値は「=」です.
  • options(省略可能)encodeURIComponentという属性を設定できるオブジェクトが入力されます:
  • EncodeURIComponent:値のタイプはfunctionで、安全でないurl文字列をパーセント形式に変換できます.デフォルトはquerystring.escape()です.
    例2,querystring.stringify
    querystring.stringify({name: 'whitemu', sex: [ 'man', 'women' ] });
    /*
    return:
    'name=whitemu&sex=man&sex=women'
    */
    querystring.stringify({name: 'whitemu', sex: [ 'man', 'women' ] },"*","$");
    /*
    return:
    'name$whitemu*sex$man*sex$women'
    */

    3 querystring.escape(str)
    Escapeは、入力された文字列を符号化することができる
    例3,querystring.escape
    querystring.escape("name=  ");
    /*
    return:
    'name%3D%E6%85%95%E7%99%BD'
    */

    4 querystring.unescape(str)
    unescapeメソッドは、%を含む文字列を復号することができる
    例4,querystring.unescape
    querystring.unescape('name%3D%E6%85%95%E7%99%BD');
    /*
    return:
    'name=  '
    */

    まとめ:
    querystringというモジュールは相対的に簡単で、4つの方法しかありません.
  • querystring.stringifyシーケンス化;
  • querystring.parse逆シーケンス化;
  • querystring.escape符号化;
  • querystring.unescape復号;

  • ステップアップ版
    変換に特化した関数を書くことができます
     private object ConvertParameter(string name, object defaultValue, bool isRequired)

    私たちはそれを抽象化する方法さえあります.
    抽象メソッドの抽出
    Attributeと反射の考え方で,まず変数にHttpQueryStringの属性を設定し,対応するQueryStringをバインドし,その後Pageベースクラスによって対応するQueryString情報を読み出す.
    属性はこう書きます(H ttpQueryStringAttribute.cs):
    [AttributeUsage(AttributeTargets.Field)] 
        
        public sealed class HttpQueryStringAttribute : Attribute { 
            private string _name; 
            private object _defaultValue; 
            private bool _isRequired; 
            
            
        public HttpQueryStringAttribute(string name) { 
                _name = name; 
                _defaultValue = null; 
                _isRequired = true; 
            }    
            
        public HttpQueryStringAttribute(string name, object defaultValue) { 
                _name = name; 
                _defaultValue = defaultValue; 
                _isRequired = false; 
            } 
        
        public string Name { 
                get { return _name; } 
            } 
            
        public object DefaultValue { 
                get { return _defaultValue; } 
            }
            
        public bool IsRequired 
            { 
                get { return _isRequired; } 
            } 
        } 

    ページベースクラスは次のとおりです(PageBase.cs):
    public class PageBase : Page 
        {
         protected override void OnLoad(System.EventArgs e) { 
                ParameterInitialize(); 
                base.OnLoad(e); 
            } 
        
        
        private void ParameterInitialize() { 
            Type type = this.GetType(); 
        
            FieldInfo[] fields = type.GetFields(); 
    
                foreach (FieldInfo field in fields) 
                {
                    HttpQueryStringAttribute attribute = (HttpQueryStringAttribute)Attribute.GetCustomAttribute(field, typeof(HttpQueryStringAttribute)); 
    
                    if (attribute != null) 
                    { 
                        SetField(field, attribute); 
                    } 
                } 
            }
            
        private void SetField(FieldInfo field, HttpQueryStringAttribute attribute) 
            {
                if (attribute.IsRequired) 
                { 
                    if (Request.QueryString[attribute.Name] != null) 
                    { 
                        SetFieldValue(field, this, attribute.Name, field.FieldType); 
                    } 
                    else 
                    { 
                        throw new Exception(string.Format("Query string /"{0}/" is required", attribute.Name), new NullReferenceException()); 
                    } 
                } 
                else 
                { 
                    if (attribute.DefaultValue == null || field.FieldType == attribute.DefaultValue.GetType()) 
                    { 
                        if (Request.QueryString[attribute.Name] == null || Request.QueryString[attribute.Name] == string.Empty) 
                        { 
                            field.SetValue(this, attribute.DefaultValue); 
                        } 
                        else 
                        { 
                            SetFieldValue(field, this, attribute.Name, field.FieldType); 
                        } 
                    } 
                    else 
                    { 
                        throw new Exception(string.Format("Invalid default value of query string /"{0}/"({1})", attribute.Name, field.Name), new NullReferenceException()); 
                    } 
                } 
            }
            
        private void SetFieldValue(FieldInfo field, object obj, string name, Type conversionType) { 
                try 
                { 
                    field.SetValue(obj, Convert.ChangeType(Request.QueryString[name], conversionType)); 
                } 
                catch (Exception ex) 
                { 
                    throw new Exception(string.Format("The given value of query string /"{0}/" can not be convert to {1}", name, conversionType), ex); 
                } 
            } 
        } 

    ページで、これでOKです(Default.aspx.cs):
    public partial class _Default : PageBase 
    { 
        [HttpQueryString("Name", "Anonymous")] 
        public string name; 
        
         [HttpQueryString("UserId")] 
        public int userId; 
    
        protected void Page_Load(object sender, EventArgs e) 
        { 
            Response.Write(string.Format("Name is {0}
    ", name)); Response.Write(string.Format("UserId is {0}
    ", userId)); } }

    ディスカッション
    定義した変数のデータ型に応じて対応するQueryStringを自動的に変換することで、後でページでQuery Stringを処理するコードを省くことができます.
    逆に考えると,QueryStringの処理は反射の高さまで上昇する必要はなく,複雑な実現は一定の柔軟性を失う可能性がある.例えば、私のある値が突然Formから得られるようになりましたか?セシオンからは?この場合、どの方法がニーズに迅速に適応するのに適しているかを比較することができます.
    ページのQueryStringの処理が、手書きコードを憎んでいるのは、このような点にほかならない.
  • ==nullが.ToString()を使う勇気があるかどうかを判断する必要があります.とても不快です.ちょっと注意しないと、異常を投げ出してページエラーを起こします.
  • 整形、double等値タイプがQueryStringから取得した場合、正当な数値かどうかはわかりませんので、Parseの場合は例外の処理コードを繰り返し書きます.