-1

URI のクエリ文字列部分にスペース (' ') があると、URLConnection.getInputStream() で奇妙な問題が発生します。具体的には、機能する URL と機能しない URL があります。両方とも失敗するか、両方とも成功する必要があると思いますが、さらに毎回です。

有効なURL: http://minneapolis.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=date&srchType=A&format=rss 失敗した URL (以下の例外): http://winnipeg.craigslist.ca/search/sss ?catAbb=sss&query=iPhone+sprint&sort=date&srchType=A&format=rss

conn.getInputStream() は IO 例外をスローします: 「インデックス 67 のクエリで無効な文字: http://winnipeg.en.craigslist.ca/search/sss?catAbb=sss&query=iPhone sprint two&sort=date&srchType=A&format=rss」

openConnection はスペースを取得できないようです (「URL」で必要になると予想されるため、既に「+」に置き換えています。「%20」も試しましたが、同じ結果が得られました。

さらに、 URL.toString() は、上で印刷したように URL を報告します。「+」はスペースではありません。

コードは次のとおりです。searchUrl は「URL」インスタンスです。

        URLConnection conn = null;
        conn = searchUrl.openConnection();
        conn.setConnectTimeout(CONNECT_TIMEOUT);
        conn.setUseCaches(true);
        conn.setAllowUserInteraction(false);

        ByteArrayOutputStream oStream = new ByteArrayOutputStream();
        InputStream istream = conn.getInputStream();
        int numBytesRead, numBytesWritten = 0;
        byte[] buffer = new byte[8 * 1024];
        while ((numBytesRead = istream.read(buffer, 0, 8 * 1024)) > 0) {
            oStream.write(buffer, numBytesWritten, numBytesRead);
            numBytesWritten += numBytesRead;
        }

これに対処する場所についてのアイデアはありますか? URLConnection を売り込み、別の道を歩もうとしています...

ありがとうケニー。

4

4 に答える 4

1

あなたの質問には何か問題があります(私のコメントを参照してください)。

ただし、ここでの根本的な問題は、クエリ部分にスペース文字を含む URL は正当な URL ではないということです...一般的な Web ブラウザーがそれを受け入れるにもかかわらず. したがって、例外は正しいです。

URL の例は、スペースが「+」でエスケープされていることを示しているようです。これは、適切な URL エスケープではなく、HTML フォーム エスケープです。同じ結果が得られると言っているようです%20...を使用すると、正しいエスケープになります。

したがって、私の理論では、エスケープを削除しているルートを介して実際にこの URL をコードに渡しているということです...トレースプリントがあなたに伝えているように見えるにもかかわらず。(SSCE を見ることができれば、この理論をテストできるのに...)


FWIW、他の回答のいくつかが示唆しているように UrlEncoder.encode を呼び出して問題を修正するのは悪い考えです。問題は、エンコードされるべきではない他の文字を「エンコード」する可能性が高いことです。

于 2012-10-01T05:51:18.537 に答える
0

URL 自体は、新しい URI(null, url, null).toASCIIString() でエンコードするのが最適です。

クエリ文字列の各キーと値は、URLEncoder.encode() で個別にエンコードできます。RFC 2936によると、これは正しくなく、URL 自体はすべてエンコードする必要がありますが、失敗したことはありません。

于 2012-10-01T08:39:52.627 に答える
-1
String url= URLEncoder.encode("your URL without http or your query string part here");
URL searchUrl = new URL("http://" + url);
URLConnection conn = null;
conn = searchUrl.openConnection();
于 2012-10-01T05:41:35.873 に答える
-1

試しましたかURLEncoder.encode(string, "UTF-8")

次に例を示します。

交換

String url = "http://somesite.com/page?user=" + user;

String url = "http://somesite.com/page?user="
+ URLEncoder.encode(user, "UTF-8");
于 2012-10-01T05:11:16.427 に答える