サポートを支援している Web アプリの設計上の欠陥を回避する最善の方法を見つけようとしています。サービスの一部は、パラメーター (「myparam」) を .jsp ページに渡します。次に、パス パラメーターとして myparam を含む REST サービスを呼び出します。設計上の欠陥は、myparam が自由なテキストである可能性があるため、フォーム パラメーターとして渡す必要があることです。ただし、.jsp の最後には他の関係者が関与しているため、実装を変更することはできません。
私の解決策は、16 進エンコーディングを使用して myparam をエンコードすることでした (REST の org.restlet 実装がパス パラメータで見たくない "%" などになるため、url エンコーディングだけでは機能しません)。Apache コーデック ライブラリを使用すると、次のようなものがあります。
オプション 1 (16 進数のみ):
String decodedParam = new String(Hex.decodeHex(myparam.toCharArray()));
これは私たちの目的のために機能します。私が本当にやりたかったのは、すべての可能性をカバーできるように、URL と 16 進数のエンコードを組み合わせることでした。
オプション 2 (16 進数 + URL デコード):
パラメータの準備:
String workText = URLEncoder.encode(inText, encoding); // a
char[] encodedBytes = Hex.encodeHex(workText.getBytes()); // b
String myparam = new String(encodedBytes);
デコード (REST):
String decodedParam = new String(Hex.decodeHex(myparam.toCharArray())); // c
String doubleDecodedParam = URLDecoder.decode(decodedParam, "UTF-8"); // d
2 つの質問があります。
2番目のオプションが機能しないのはなぜですか? (d で文字列を URL デコードしようとするたびに) java.lang.IllegalArgumentException が発生します)。http://ostermiller.org/calc/encode.htmlで、パラメータ値の二重エンコードとデコードを問題なくテストしました。
RESTでパスパラメータをエンコードするより良い方法はありますか?