如何处理java字符串中的和号并发送url作为查询参数值?

xkrw2x1b  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(295)

我试图通过以下方式从java代码调用url:

userId = "Ankur";
template = "HelloAnkur";
value= "ParamValue";
String urlString = "https://graph.facebook.com/" + userId + "/notifications?template=" +
    template + "&href=processThis.jsp?param=" + value + "&access_token=abc123";

我在这方面有以下问题:
当我这么做的时候 println(urlString) ,我看到 urlString 只有在第一个和之前的值( & ). 也就是说,它看起来像: https://graph.facebook.com/Ankur/notifications?template=HelloAnkur 剩下的(应该是 &href=processThis.jsp?param=ParamValue&access_toke=123 )被切断。为什么会这样?我怎样才能得到并保持全部价值 urlString ? 做 & 需要在java字符串中转义,如果是,如何转义?
请注意,我试图在这个查询中传递一个(相对)url作为参数值( href 作为 processThis.jsp?param=ParamValue . 如何传递这种类型的值 href 不会和这个url的查询混淆( urlString ),只有三个参数 template , href 以及 access_token ? 也就是说,我怎样才能躲藏或逃脱 ? 以及 = ? 此外,如果 valueParam Value (有空格)?
请注意 template 有价值吗 HelloAnkur (没有空格)。但如果我想让它有空间 Hello Ankur ,我该怎么做?我应该把它写成 Hello%20Ankur 或者 Hello Ankur 可以吗?
我需要这样的解决方案 URL url = new URL(urlString) 可以创建,或者 url 可通过以下方式创建 URI . 请描述到目前为止您的答案,因为在java中创建一个安全的url不是直截了当的。
谢谢!

jmp7cifd

jmp7cifd1#

(这将成为经典)
使用uri模板(rfc 6570)。使用此实现(免责声明:我的),您可以完全避免所有编码问题:

// Immutable, can be reused as many times as you wish
final URITemplate template = new URITemplate("https://graph.facebook.com/{userId}"
    + "/notifications?template={template}"
    + "&href=processThis.jsp?param={value}"
    + "&access_token=abc123");

final Map<String, VariableValue> vars = new HashMap<String, VariableValue>();

vars.put("userId", new ScalarValue("Ankur"));
vars.put("template", new ScalarValue("HelloAnkur"));
vars.put("value", new ScalarValue("ParamValue");

// Build the expanded string
final String expanded = template.expand(vars);

// Go with the string

请注意,uri模板不仅允许标量值,还允许数组(rfc调用这些“列表”--实现为 ListValue 在上面)和Map(rfc称这些“关联数组”--实现为 MapValue 在上面)。

相关问题