50

次のエラー メッセージが表示されました。

java.net.URISyntaxException: Illegal character in query at index 31: http://finance.yahoo.com/q/h?s=^IXIC

My_Url = http://finance.yahoo.com/q/h?s=^IXIC

それをブラウザのアドレスフィールドにコピーすると、正しいページが表示されました。これは有効ですURLが、これでは解析できません。new URI(My_Url)

私は試しました:My_Url=My_Url.replace("^","\\^")、しかし

  1. それは私が必要とする URL ではありません
  2. どちらも機能しません

これを処理する方法は?

フランク

4

10 に答える 10

60

URI をエンコードして、不正な文字を正当なエンコードされた文字に置き換える必要があります。最初に URL を作成し (自分で解析する必要がありません)、次に5 つの引数のコンストラクターを使用して URI を作成すると、コンストラクターがエンコードを行います。

import java.net.*;

public class Test {
  public static void main(String[] args) {
    String myURL = "http://finance.yahoo.com/q/h?s=^IXIC";
    try {
      URL url = new URL(myURL);
      String nullFragment = null;
      URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), nullFragment);
      System.out.println("URI " + uri.toString() + " is OK");
    } catch (MalformedURLException e) {
      System.out.println("URL " + myURL + " is a malformed URL");
    } catch (URISyntaxException e) {
      System.out.println("URI " + myURL + " is a malformed URL");
    }
  }
}
于 2009-04-15T00:17:28.300 に答える
23

文字%のエンコーディングを使用します。^http://finance.yahoo.com/q/h?s=%5EIXIC

于 2009-04-14T23:32:33.150 に答える
15

パラメータをエンコードする必要があります。

このようなことができます:

import java.net.*;
import java.io.*;

public class EncodeParameter { 

    public static void main( String [] args ) throws URISyntaxException ,
                                         UnsupportedEncodingException   { 

        String myQuery = "^IXIC";

        URI uri = new URI( String.format( 
                           "http://finance.yahoo.com/q/h?s=%s", 
                           URLEncoder.encode( myQuery , "UTF8" ) ) );

        System.out.println( uri );

    }
}

http://java.sun.com/javase/6/docs/api/java/net/URLEncoder.html

于 2009-04-15T01:33:13.050 に答える
4

事前に URL をエンコードする代わりに、次のことができます。

String link = "http://example.com";
URL url = null;
URI uri = null;

try {
   url = new URL(link);
} catch(MalformedURLException e) {
   e.printStackTrace();
}

try{
   uri = new URI(url.toString())
} catch(URISyntaxException e {
   try {
        uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(),
                      url.getPort(), url.getPath(), url.getQuery(), 
                      url.getRef());
   } catch(URISyntaxException e1 {
        e1.printStackTrace();
   }
}
try {
   url = uri.toURL()
} catch(MalfomedURLException e) {
   e.printStackTrace();
}

String encodedLink = url.toString();
于 2016-04-13T14:33:00.830 に答える
2

一般的な解決策では、URL を RFC 2396 準拠の URI に解析する必要があります (これは、java.net.URI が使用する URI 標準の古いバージョンであることに注意してください)。

これを可能にする Java URL 解析ライブラリを作成しました: galimatias . このライブラリを使用すると、次のコードで目的の動作を実現できます。

String urlString = //...
URLParsingSettings settings = URLParsingSettings.create()
  .withStandard(URLParsingSettings.Standard.RFC_2396);
URL url = URL.parse(settings, urlString);

galimatias は非常に初期の段階にあり、一部の機能は実験的なものですが、このユース ケースではすでにかなり安定していることに注意してください。

于 2014-01-02T00:06:21.040 に答える
1


http://server.ru:8080/template/get?type=mail&format=html&key=ecm_task_assignment&label =Согласовать с контрагентом&descr=Описание&objectid= 2231
:

public static boolean checkForExternal(String str) {
    int length = str.length();
    for (int i = 0; i < length; i++) {
        if (str.charAt(i) > 0x7F) {
            return true;
        }
    }
    return false;
}

private static final Pattern COLON = Pattern.compile("%3A", Pattern.LITERAL);
private static final Pattern SLASH = Pattern.compile("%2F", Pattern.LITERAL);
private static final Pattern QUEST_MARK = Pattern.compile("%3F", Pattern.LITERAL);
private static final Pattern EQUAL = Pattern.compile("%3D", Pattern.LITERAL);
private static final Pattern AMP = Pattern.compile("%26", Pattern.LITERAL);

public static String encodeUrl(String url) {
    if (checkForExternal(url)) {
        try {
            String value = URLEncoder.encode(url, "UTF-8");
            value = COLON.matcher(value).replaceAll(":");
            value = SLASH.matcher(value).replaceAll("/");
            value = QUEST_MARK.matcher(value).replaceAll("?");
            value = EQUAL.matcher(value).replaceAll("=");
            return AMP.matcher(value).replaceAll("&");
        } catch (UnsupportedEncodingException e) {
            throw LOGGER.getIllegalStateException(e);
        }
    } else {
        return url;
    }
}
于 2013-03-22T12:45:38.440 に答える
0

Java でスプリング コントローラに投稿するために使用している場合、代わりにRestangularV2使用すると、この例外が発生する可能性があります。RestangularV2.one()RestangularV2.all()

于 2016-10-11T15:53:40.607 に答える