0

我正在尝试通过以下方式从 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 作为此查询中的参数值(hrefas的值processThis.jsp?param=ParamValue。我如何传递这种类型的值href而不将其与此 URL ( urlString) 的查询混合在一起,它只有三个参数templatehrefaccess_token?也就是说,我如何隐藏或逃避?和?此外,如果是(带空格)=我需要做什么?valueParam Value
  3. 请注意,template具有值HelloAnkur(没有空格)。但是,如果我希望它有空间,如Hello Ankur,我该怎么做?我应该这样写Hello%20Ankur还是Hello Ankur可以?
  4. 我需要一种URL url = new URL(urlString)可以创建的解决方案,或者url可以通过URI. 请描述您到目前为止的答案,因为在 Java 中创建安全 URL 并不简单。

谢谢!

4

1 回答 1

1

(这将成为经典)

使用 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如上实现)和映射(RFC 称这些“关联数组”——MapValue如上实现)。

于 2013-06-06T16:23:31.290 回答