B-Teck!

お仕事からゲームまで幅広く

【Java/Kotlin】URI Template(RFC6570)の仕様に則ってURL文字列に変数をセットする

"http://example.com/name/{name}/age/{age}"のような文字列に対して変数を割り当てたいとき、 javax.ws.rs.core.UriBuilderが利用できる。

URI文字列がqueryも含む場合は、 UriBuilder.fromUri() を利用すると良い。

  • Javaの場合
import javax.ws.rs.core.UriBuilder;
import java.util.HashMap;
import java.util.Map;

class Demo {
    public static void main(String[] args) {
        String template = "http://example.com/name/{name}/age/{age}";

        // mapで変数に対応するkey-valueを与えると置換できる
        // UriBuilder.buildFromMap()
        Map<String, String> parameters = new HashMap<>();
        parameters.put("name","Bob");
        parameters.put("age","17");

        String bob = UriBuilder.fromPath(template)
                .buildFromMap(parameters)
                .toASCIIString();
        
        // http://example.com/name/Bob/age/17
        System.out.println(bob);
  
        // 変数の順番が固定であれば、手前から順番に置換することもできる
        // UriBuilder.build()
        String alice = UriBuilder
                .fromPath(template)
                .build("Alice","15")
                .toASCIIString();

        // http://example.com/name/Alice/age/15
        System.out.println(alice);
    }
}
  • Kotlinの場合
import javax.ws.rs.core.UriBuilder

fun main() {
    val template = "http://example.com/name/{name}/age/{age}"

    // mapで変数に対応するkey-valueを与えると置換できる
    // UriBuilder.buildFromMap()
    val parameters = mapOf(
            "name" to "Bob",
            "age" to "17"
    )

    val bob = UriBuilder.fromPath(template)
            .buildFromMap(parameters)
            .toASCIIString()

    // http://example.com/name/Bob/age/17
    println(bob)

    // 変数の順番が固定であれば、手前から順番に置換することもできる
    // UriBuilder.build()
    val alice = UriBuilder.fromPath(template)
            .build("Alice", "15")
            .toASCIIString()

    // http://example.com/name/Alice/age/15
    println(alice)
}

参考 : how to use URI templates to change path parameters in a URL in java - Stack Overflow