如何在Java String中处理&符号并将URL作为查询参数值发送?

时间:2013-06-06 16:17:56

标签: java facebook facebook-graph-api

我试图通过以下方式从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";

我有以下问题:

  1. 当我执行println(urlString)时,我发现urlString仅在第一个&符号(&)之前具有值。也就是说,它看起来像:https://graph.facebook.com/Ankur/notifications?template=HelloAnkur,其余部分(应该是&href=processThis.jsp?param=ParamValue&access_toke=abc123)被切断了。为什么这样,我怎样才能获得并保持urlString的全部价值?是否需要在Java字符串中转义&,如果是,则如何进行转义?
  2. 请注意,我正在尝试将(相对)URL作为参数值传递给此查询(href的值为processThis.jsp?param=ParamValue。如何传递此类型的{{1}值不将它与此网址(href)的查询混在一起,该网址只有三个参数urlStringtemplatehref?也就是说,我该如何隐藏或者转义access_token??此外,如果=value(有空格),我还需要做什么?
  3. 请注意,Param Value的值为template(没有空格)。但如果我希望它有空间,就像在HelloAnkur中那样,我该怎么做呢?我应该将其写为Hello Ankur还是Hello%20Ankur会没事?
  4. 我需要的解决方案可以创建Hello Ankur,或者URL url = new URL(urlString)可以通过url创建。请描述您到目前为止的答案,因为在Java中创建安全的URL并不是直截了当。
  5. 谢谢!

1 个答案:

答案 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