[解決済み】Androidでのクエリ文字列のパースについて
質問
Java EEは
ServletRequest.getParameterValues()
.
非EEプラットフォームでは
URL.getQuery()
は単に文字列を返します。
の場合、URLのクエリー文字列を適切にパースする通常の方法は何でしょうか? ではなく をJava EEで使用することはできますか?
回答では、パーサーを自作してみるのが流行っているようです。 これは非常に面白く、エキサイティングなマイクロコーディングのプロジェクトですが とは言い切れませんが .
以下のコード・スニペットは、一般的に欠陥があったり、壊れていたりします。それらを壊すことは、読者にとって面白い練習になります。 そして、それらを使用しているウェブサイトを攻撃しているハッカーに .
クエリ文字列の解析はよく定義された問題ですが、仕様を読み、ニュアンスを理解することは容易ではありません。プラットフォームライブラリのコーダーに難しい作業や修正を任せる方がはるかに良いですよ。
解決方法は?
Android M以降、事態はより複雑になっています。の答えは
android.net.URI.getQueryParameter()
には、JellyBeanの前にあるスペースが壊れるというバグがあります。
アパッチ
URLEncodedUtils.parse()
は動作しましたが
Lで非推奨
であり、また
Mで削除
.
ということで、今のベストアンサーは
UrlQuerySanitizer
. これはAPIレベル1から存在し、今もなお存在する。また、特殊文字や繰り返し値をどう扱うかなど、厄介な問題についても考えさせられます。
最もシンプルなコードは
UrlQuerySanitizer.ValueSanitizer sanitizer = UrlQuerySanitizer.getAllButNullLegal();
// remember to decide if you want the first or last parameter with the same name
// If you want the first call setPreferFirstRepeatedParameter(true);
sanitizer.parseUrl(url);
String value = sanitizer.getValue("paramName");
もし、デフォルトのパース動作に満足しているのであれば、こうすることができます。
new UrlQuerySanitizer(url).getValue("paramName")
しかし、デフォルトのパース動作がどのようなものかを理解しておく必要があります。
関連
-
[解決済み] java.lang.ClassCastException: java.util.Arrays$ArrayList は java.util.ArrayList にキャストできません。
-
[解決済み] Javaにおけるシンボリック参照
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] JavaScriptでクエリ文字列の値を取得するにはどうすればよいですか?
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] UnixツールでJSONをパースする
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] Firebase クラスにシリアライズするプロパティが見つからない
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] 型の不一致:ArrayListからListへの変換ができない
-
[解決済み] 1行目2列目でBEGIN_ARRAYを期待したが、BEGIN_OBJECTだった。
-
[解決済み] java.sql.SQLRecoverableException: IO エラーです。NL Exceptionが発生しました
-
[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない
-
[解決済み】URI文字列をパースして名前-値コレクションを作成する方法