2009-04-14 15 views
32

Tengo este mensaje de error:¿Cómo hacer frente a la URISyntaxException

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

Cuando he copiado en un campo de dirección del navegador, que mostraron la página correcta, es una válida URL, pero no se puede analizar con esto: new URI(My_Url)

traté: My_Url=My_Url.replace("^","\\^"), pero

  1. No será la url necesito
  2. No funciona bien

cómo manejar esto?

Frank

Respuesta

14

Uso % codificación para el ^ carácter, a saber. http://finance.yahoo.com/q/h?s=%5EIXIC

51

Debe codificar el URI para reemplazar caracteres ilegales con caracteres codificados legalmente. Si primero hace una URL (por lo que no tiene que hacer el análisis él mismo) y luego hace una URI usando el five-argument constructor, el constructor hará la codificación por usted.

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"); 
    } 
    } 
} 
+0

Solo asegúrese de utilizar URLDecoder si luego desea convertir ese URI en una URL, p. 'new FileInputStream (URLDecoder.decode (uri.toURL(). getFile()," UTF-8 "))' – MrDrews

+0

Intenté varias otras soluciones sugeridas, esto parece ser el truco. Puede usar el "uri" directamente en su "nuevo HttpGet (uri)". –

+0

AYÚDENME ALOT @@@@@@@@@@@ >>>>>>>>>>>>>>> –

14

Tiene que codificar los parámetros.

Algo como esto va a hacer:

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

1

baremo no imaginar nada mejor para
http://server.ru:8080/template/get?type=mail&format=html&key=ecm_task_assignment&label = Согласовать с контрагентом & descr = Описание & objectid = 2,231
que:

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; 
    } 
} 
1

Una solución general requiere analizar el URL en un URI compatible con RFC 2396 (tenga en cuenta que esta es una versión anterior del estándar URI, que usa java.net.URI).

He escrito una biblioteca de análisis de URL Java que lo hace posible: galimatias. Con esta biblioteca, se puede lograr el comportamiento deseado con este código:

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

Tenga en cuenta que GALIMATIAS se encuentra en una fase muy temprana y algunas características son experimentales, pero ya es bastante sólida para este caso de uso.

0

Tuve esta excepción en el caso de una prueba para verificar algunas URL accedidas por los usuarios.

Y las URL alguna vez contienen un carácter ilegal y se cuelgan por este error.

Así que hago una función para codificar solo los caracteres en la cadena de URL como esta.

String encodeIllegalChar(String uriStr,String enc) 
    throws URISyntaxException,UnsupportedEncodingException { 
    String _uriStr = uriStr; 
    int retryCount = 17; 
    while(true){ 
    try{ 
     new URI(_uriStr); 
     break; 
    }catch(URISyntaxException e){ 
     String reason = e.getReason(); 
     if(reason == null || 
     !(
      reason.contains("in path") || 
      reason.contains("in query") || 
      reason.contains("in fragment") 
     ) 
     ){ 
     throw e; 
     } 
     if(0 > retryCount--){ 
     throw e; 
     } 
     String input = e.getInput(); 
     int idx = e.getIndex(); 
     String illChar = String.valueOf(input.charAt(idx)); 
     _uriStr = input.replace(illChar,URLEncoder.encode(illChar,enc)); 
    } 
    } 
    return _uriStr; 
} 

prueba:

String q = "\\'|&`^\"<>)(}{]["; 
String url = "http://test.com/?q=" + q + "#" + q; 
String eic = encodeIllegalChar(url,'UTF-8'); 
System.out.println(String.format(" original:%s",url)); 
System.out.println(String.format(" encoded:%s",eic)); 
System.out.println(String.format(" uri-obj:%s",new URI(eic))); 
System.out.println(String.format("re-decoded:%s",URLDecoder.decode(eic))); 
4

Más bien que codifica la dirección URL antes de mano que puede hacer lo siguiente

String link = "http://foo.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(); 
0

Si está utilizando RestangularV2 para colocar a un controlador de primavera en java puede obtener esta excepción si usa RestangularV2.one() en lugar de RestangularV2.all()

0

Reemplazar espacios en URL con + como If url contiene dimension1 = Incontinence Liners luego reemplazarlo con dimension1 = Incontinence + Liners.

Cuestiones relacionadas