毎回必要な時に調べ直しているので備忘録。
Uri.BuilderでGETのパラメータをreplaceできるメソッドがあると思いこんでいるも見当たらないため、調査に毎回時間を浪費していた。
以下の手順でやりたいことは実現出来る。
- 全てのqueryParamsを取得できるようにURLをUri.parseする
- Uri.Builder.clearQuery()で全てのqueryParamsを削除する
- 置き替えたいkeyが存在していたら置き替えたい値をUri.Builder.appendQueryParameterで新規追加する
- 上記3以外はそのままUri.Builder.appendQueryParameterで新規追加する
■置き替え前後のURLは以下
クエリパラメータ置き替え前URL: https://exsample.com/?key=value&key2=value2
クエリパラメータ置き替え後URL: https://exsample.com/?key=newValue&key2=value2
■実ソースは以下
val KEY = "key"// 置き替えたいパラメータのKey
val newValue = "newValue"// 置き替えたいパラメータのValue
val url = "https://exsample.com/?key=value&key2=value2"
val replacedUrl: String = url.let {
val uri = Uri.parse(it)
// Uri.Builder.clearQuery()で全てのqueryParamsを削除
val uriBuilder = uri.buildUpon().clearQuery()
// 全GETパラメータを生成しなおし
uri.queryParameterNames.map { queryParam ->
if (queryParam == KEY) {
// 置き替えたいKeyだったら新しいValueで新規生成
uriBuilder.appendQueryParameter(queryParam, newValue)
} else {
// 置き換え不要のKeyはそのまま元から入っていたValueで新規生成
uriBuilder.appendQueryParameter(queryParam, getQueryParameter(queryParam))
}
}
uriBuilder.build().toString()
}
// 結果表示
Logger.d("replacedUrl: $replacedUrl")
以上。