queryStringを解決する
13743 ワード
querystringは文字通りクエリー文字列を意味し,httpリクエストに伴うデータを解析するのが一般的である.Querystringモジュールでは、4つの方法しか提供されていません. querystring.parse querystring.stringify querystring.escape querystring.unescape
この4つの方法は対応している.
まず、querystringモジュールを使用する前に、requireが入る必要があります.
次に、モジュールの次の方法を使用できます.
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
2 querystring.stringify(obj,separator,eq,options)
stringifyこの方法は、querystring.parseに対してオブジェクトを文字列にシーケンス化することです.
パラメータ: objとは、シーケンス化が必要なオブジェクト を指す. separator(省略可能)キー値ペアを接続する文字または文字列で、デフォルト値は「&」です. eq(省略可能)キーと値を接続する文字または文字列で、デフォルト値は「=」です. options(省略可能)encodeURIComponentという属性を設定できるオブジェクトが入力されます: EncodeURIComponent:値のタイプはfunctionで、安全でないurl文字列をパーセント形式に変換できます.デフォルトはquerystring.escape()です.
例2,querystring.stringify
3 querystring.escape(str)
Escapeは、入力された文字列を符号化することができる
例3,querystring.escape
4 querystring.unescape(str)
unescapeメソッドは、%を含む文字列を復号することができる
例4,querystring.unescape
まとめ:
querystringというモジュールは相対的に簡単で、4つの方法しかありません. querystring.stringifyシーケンス化; querystring.parse逆シーケンス化; querystring.escape符号化; querystring.unescape復号;
ステップアップ版
変換に特化した関数を書くことができます
私たちはそれを抽象化する方法さえあります.
抽象メソッドの抽出
Attributeと反射の考え方で,まず変数にHttpQueryStringの属性を設定し,対応するQueryStringをバインドし,その後Pageベースクラスによって対応するQueryString情報を読み出す.
属性はこう書きます(H ttpQueryStringAttribute.cs):
ページベースクラスは次のとおりです(PageBase.cs):
ページで、これでOKです(Default.aspx.cs):
ディスカッション
定義した変数のデータ型に応じて対応するQueryStringを自動的に変換することで、後でページでQuery Stringを処理するコードを省くことができます.
逆に考えると,QueryStringの処理は反射の高さまで上昇する必要はなく,複雑な実現は一定の柔軟性を失う可能性がある.例えば、私のある値が突然Formから得られるようになりましたか?セシオンからは?この場合、どの方法がニーズに迅速に適応するのに適しているかを比較することができます.
ページのQueryStringの処理が、手書きコードを憎んでいるのは、このような点にほかならない.==nullが.ToString()を使う勇気があるかどうかを判断する必要があります.とても不快です.ちょっと注意しないと、異常を投げ出してページエラーを起こします. 整形、double等値タイプがQueryStringから取得した場合、正当な数値かどうかはわかりませんので、Parseの場合は例外の処理コードを繰り返し書きます.
この4つの方法は対応している.
まず、querystringモジュールを使用する前に、requireが入る必要があります.
const querystring = require("querystring");
次に、モジュールの次の方法を使用できます.
1 querystring.parse(str,separator,eq,options)
parseこの方法は、文字列をオブジェクトに逆シーケンス化することです.
パラメータ:
例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に対してオブジェクトを文字列にシーケンス化することです.
パラメータ:
例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つの方法しかありません.
ステップアップ版
変換に特化した関数を書くことができます
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の処理が、手書きコードを憎んでいるのは、このような点にほかならない.