我试图通过以下方式从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=abc123
)被切断了。为什么这样,我怎样才能获得并保持urlString
的全部价值?是否需要在Java字符串中转义&
,如果是,则如何进行转义?href
的值为processThis.jsp?param=ParamValue
。如何传递此类型的{{1}值不将它与此网址(href
)的查询混在一起,该网址只有三个参数urlString
,template
和href
?也就是说,我该如何隐藏或者转义access_token
和?
?此外,如果=
为value
(有空格),我还需要做什么?Param Value
的值为template
(没有空格)。但如果我希望它有空间,就像在HelloAnkur
中那样,我该怎么做呢?我应该将其写为Hello Ankur
还是Hello%20Ankur
会没事?Hello Ankur
,或者URL url = new URL(urlString)
可以通过url
创建。请描述您到目前为止的答案,因为在Java中创建安全的URL并不是直截了当。谢谢!
答案 0 :(得分:1)
(这将成为经典之作)
使用URI模板(RFC 6570)。使用this implementation(免责声明:我的),您可以完全避免所有编码问题:
// 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称这些&#34;列表&#34; - 在上面实现为ListValue
)和映射(RFC称这些& #34;关联数组&#34; - 在上面实现为MapValue
。