そう難しくはない。
GWTのクライアント側クラス
com.google.gwt.http.client.URL
を使えばよい。
String converted =
URL.encode(original);
という具合。
通常のURLへのリダイレクト処理などは
これで大丈夫である。
しかし..なぜか
String converted =
java.net.URLEncoder.encode(original, "UTF-8");
と全く同じ文字列にならない..
今回の実装はCloudStack APIを呼び出すURL生成を
サーバへ秘密キー送信せずに処理することなので
同じ結果にしないといけない。
いろいろ調べてみると
com.google.gwt.http.client.URL#encode()では
RFC3986にて定義されている予約文字を%から始まるUTF-8コードに
変換しないのだ。
しょうがないので
com.google.gwt.http.client.URL#encode()
で変換した文字列を以下の処理をかけ
予約後をすべてUTF-8コードに手動で変換して対応した。
public static final String[][] RF3986_RESERVED =
{{":", "%3A"},
{"/", "%2F"},
{"?", "%3F"},
{"#", "%23"},
{"[", "%5B"},
{"]", "%5D"},
{"@", "%40"},
{"!", "%21"},
{"$", "%24"},
{"&", "%26"},
{"'", "%27"},
{"(", "%28"},
{")", "%29"},
{"*", "%2A"},
{"+", "%2A"},
{",", "%2C"},
{";", "%3B"},
{"=", "%3D"}};
private String replaceRFC3984ReservedChars(String org){
StringBuffer ret = new StringBuffer();
for(int pos=0;pos<org.length();pos++){
String tgt = String.valueOf(org.charAt(pos));
for(int index=0;index
if(tgt.equals(RF3986_RESERVED[index][0])){
tgt = RF3986_RESERVED[index][1];
break;
}
}
ret.append(tgt);
}
return ret.toString();
}
これでなんとかURLencodeすることが出来た。
0 件のコメント:
コメントを投稿