9

コンテンツを取得するために必要なURLのリストがあります。URLは特殊文字を使用しているため、エンコードする必要があります。CommonsHtpClientを使用してコンテンツを取得します。

私が使用するとき:

GetMethod get = new GetMethod(url);

「無効な「不正なエスケープ文字」例外が発生します。使用すると

 GetMethod get = new GetMethod();
 get.setURI(new URI(url.toString(), false, "UTF-8"));

ページを取得しようとすると404が表示されます。これは、スペースが.%2520だけではなくになっているため%20です。

私はこの問題について多くの投稿を見てきましたが、それらのほとんどは、URIを部分的に構築するようにアドバイスしています。問題は、それがURLの特定のリストであり、手動で処理できるリストではないことです。

この問題に対する他の解決策はありますか?

ありがとう。

4

4 に答える 4

5

のような文字列から新しい URL オブジェクトを作成し、URL urlObject = new URL(url)それurlObject.getQuery()urlObject.getPath()正しく分割するには、Query Params を List または Map などに解析し、次のようにします。

編集:URLEncodedUtils.parse() HttpClient ライブラリには、以下に示すコードで簡単に使用できるメソッドがあることがわかりました。適合するように編集しますが、テストされていません。

Apache HttpClient では、次のようになります。

URI urlObject = new URI(url,"UTF-8");
HttpClient httpclient = new DefaultHttpClient();
List<NameValuePair> formparams = URLEncodedUtils.parse(urlObject,"UTF-8");
UrlEncodedFormEntity entity;
entity = new UrlEncodedFormEntity(formparams);

HttpPost httppost = new HttpPost(urlObject.getPath());
httppost.setEntity(entity);
httppost.addHeader("Content-Type","application/x-www-form-urlencoded");

HttpResponse response = httpclient.execute(httppost);

HttpEntity entity2 = response.getEntity();

Java URLConnection では、次のようになります。

    // Iterate over query params from urlObject.getQuery() like
while(en.hasMoreElements()){
    String paramName  = (String)en.nextElement(); // Iterator over yourListOfKeys
    String paramValue = yourMapOfValues.get(paramName); // replace yourMapOfNameValues
    str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue);
}
try{
    URL u = new URL(urlObject.getPath()); //here's the url path from your urlObject
    URLConnection uc = u.openConnection();
    uc.setDoOutput(true);
    uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    PrintWriter pw = new PrintWriter(uc.getOutputStream());
    pw.println(str);
    pw.close();

    BufferedReader in = new BufferedReader(new 
            InputStreamReader(uc.getInputStream()));
    String res = in.readLine();
    in.close();
    // ...
}
于 2012-07-26T10:37:17.403 に答える
-1

URLEncoderクラスを使用してください。
私はそれを正確なシナリオで使用しましたが、それは私にとっては問題なく機能しました。
私がしたことは、URLクラスを使用して、ホストの後に続く部分を取得することです
(たとえば、www.bla.com / mystuff/bla.jpgではこれは"mystuff/bla.jpg"になります-URLEncodeのみを行う必要がありますこの部分を選択してから、URLを再度作成します。

たとえば、元の文字列が「http://www.bla.com/mystuff/bla foo.jpg」の場合、次のようになります。
エンコード-「mystuff/blafoo.jpg」 「mystuff/bla%20foo.jpg」そしてこれをホストとプロトコルの部分に添付します:
「http://www.bla.com/mystuff/bla%20foo.jpg」
これがお役に立てば幸いです

于 2012-07-26T10:12:57.240 に答える