Translate

2013年3月9日土曜日

Google Web Toolkitクライアント側でURLエンコード変換する

GWTクライアント側のみでURLEncode変換する場合
そう難しくはない。

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 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...