2017-07-18 11 views
0

私はいくつかのコードを働いて、と気づいた:Uriクラスは、queryParametersに値のあるキーが含まれているとエラーをスローします。

return new Uri(host: server, path: apiPath, query: query, queryParameters: queryParams); 

このコードは、アプリケーション全体で定期的に実行され、唯一の違いは、queryParamsました。だから私はそれをプリントアウト:ID:の値セット:リスト、有効:ブール

{Id:[1234], enabled:false} 

は、それがキーであることを示しています。私が手

スタックトレースは次のとおりです。 enter image description here

マップして、トレースを示しています。 #6は上記の行を指します。

偽を見ています...偽を繰り返すものがこれを破るものです。

答えて

1

URIとクエリパラメータを扱う場合、数値、リスト、および文字列を検索しますがブール値は探しません。これを解決して正しく機能させるには、次のようにする必要があります。

{"enabled": false.toString()} 
// or 
{"enabled": "false"} 

となり、uriクラスはそれに応じてクエリパラメータを設定します。

Uriクラスは、Dartのコアライブラリにあります。我々はそれを使用しているとき、私たちは、クライアントクラスのための行動に作成されたUriオブジェクト内のパラメータの一部としてURLを受け入れ

Client client = new BrowserClient(); 

を渡しています。

しかし、上記のエラーを見ても、最終的にUriクラスは偽の値を許容値に正しく解析できません。ダート言語ごとにウリのコードのドキュメントを見て

時:https://api.dartlang.org/dev/1.25.0-dev.7.0/dart-core/Uri/Uri.html

クエリコンポーネントは、クエリまたはqueryParametersのいずれかを介して設定されています。クエリを使用する場合、指定された文字列は有効なURIクエリである必要がありますが、一般的な区切り文字以外の無効な文字は必要に応じてエスケープされます。 queryParametersを使用すると、クエリは提供されたマップから構築されます。マップの各キーと値は、パーセントエンコードされ、等号とアンパサンド文字を使用して結合されます。マップ内の値は文字列か、文字列の反復可能でなければなりません。後者は同じキーの複数の値に対応します。

すべての値はStringまたはIterable of Stringでなければならないと言ってよいでしょう。私が理解できないのは、DartpadではtrueとfalseにtoString関数がありますが、そこに数値を渡すこともできます。

唯一の結論は、StringsのStringsとIterablesを受け入れる一方で、URIでよく見られるようにその型を明示的にチェックするため、intやその他の数値も解析するということです。

これは一般的な場所なので、URIはブーリアンを理解すると思う人もいますが、ダートラングのソースコードを明示的に見ることはできません。私はそれのためのソースコードを見て、それを絞り込んだ。 writeComponentは_Uri._uriEncodeを指しますが、その関数を見ると単なる定義のようなコードはありません。

HTH。

関連する問題