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)わかります。つまり、次のように見えます:そして残りのすべて (あるべきだった) が切り取られます。それはなぜですか、また、完全な値を取得して保持するにはどうすればよいですか? Java 文字列でエスケープする必要がありますか? はいの場合、どのように行うのですか?urlString&https://graph.facebook.com/Ankur/notifications?template=HelloAnkur&href=processThis.jsp?param=ParamValue&access_toke=abc123urlString&
  2. このクエリのパラメーター値として (相対) URL を渡そうとしていることに注意してください ( hrefasの値processThis.jsp?param=ParamValue。このタイプの値を、この URL ( )hrefのクエリと混同せずに渡すにはurlString3 つのパラメーターtemplate, hrefand access_token? つまり、どのように非表示またはエスケープできますか? さらに?、(スペースを使用して)だった場合は=どうすればよいでしょうか?valueParam Value
  3. templateに値があることに注意してくださいHelloAnkur(スペースなし)。しかし、 のようにスペースを確保したい場合はHello Ankur、どうすればよいでしょうか。のように書くべきでしょうかHello%20AnkurHello 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 に答える