Friday, April 29, 2011

How to deal with the URISyntaxException

I got this error message :

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

When I copied it into a browser address field, it showed the correct page, it's a valid URL, but I can't parse it with this : new URI(My_Url)

I tried : My_Url=My_Url.replace("^","\\^"), but 

<1> It won't be the url I need
<2> It doesn't work either

How to handle this ?

Frank

From stackoverflow
  • Use "%"-encoding for the "^" character, viz. http://finance.yahoo.com/q/h?s=%5EIXIC

  • You need to encode the URI to replace illegal characters with legal encoded characters. If you first make a URL (so you don't have to do the parsing yourself) and then make a URI using the four-argument constructor, then the constructor will do the encoding for you.

    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);
          URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null);
          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");
        }
      }
    }
    
  • You have to encode your parameters.

    Something like this will do:

    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

0 comments:

Post a Comment