2010-11-23 8 views
2

これは明らかに以前に返信されていたようですので、私は正しいスレッドを逃しているに違いないと感じます。私はここや他の場所のスレッドをたくさん読んでいましたが、私はこの質問に対する答えが「これはあなたのやり方です」とは見えませんでした...文字列URLを取得し、それをエンコードするための最良の方法は何ですか

プログラムは完全なURLを文字列として受け取ります。例: "http://www.stackoverflow.com/questions/somepage?somequery#somefragment"

この文字列を受け取り、HttpClientのような接続で使用するために正しくエンコードされていることを確認します。

私が読んだところから、これを行う方法は、さまざまな部分をパラメータとして持つURI()コンストラクタを使用するように思えます。それでは、URLであること以外はわかっていない、文字列urlを取得する最も信頼できる方法は何か、そしてURI()コンストラクタに必要なさまざまな部分に分割してください。

ここで私は一緒につなぎました。この方法に欠陥がありますか?

URL url = new URL(urlString); 
URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(), url.getQuery(), null); 

次に、uri変数には、エンコードされたすぐに使用できるURIが含まれています。このコードはこれまでのところ動作しますが、発生する可能性のある落とし穴がないことを確認したいと思います。

ありがとうございました

答えて

4

URIクラスは、特定の状況でそのコンポーネントフィールドのエスケープを行うんURLEncodeする必要があります。 URLのエンコーディングとデコードを管理するには、URIを使用し、toURI()とURI.toURL()を使用してこれらの2つのクラスを変換することをお勧めします。 参考:http://download.oracle.com/javase/1.5.0/docs/api/java/net/URL.html

注意、RFC 2396に準拠して任意のURLインスタンスはURIに変換することができます。ただし、厳密に準拠していないURLの中には、URIに変換できないものがあります。

URI.toURLは、それが最初にこのURIがABSOLUT * Eであることを確認して表現* new URL(this.toString())を評価と同等であったかのように呼び出す便利なメソッドの動作です。

0

私はURIを構築する必要はないと思います。 urlは "URL url = new URL(urlString);"を使用して構築されます。 URLの構築がMalformedURLExceptionをスローしない限り、HttpClientによって使用されるために完全に有効です。あなたは(GET用)クエリ文字列を持ってしようとしている場合は

、その後、あなたはそれが

+0

URLのクラスは、ネットワークI/Oを引き起こす特定のメソッドを呼び出す際に、文字列操作のために避けるべきです。 – McDowell

+0

ありがとうございます。私はこの状況を認識していましたが、最近のバージョンでこれが修正されている箇所を読んだことがあります。 –

関連する問題