How to deal with the URISyntaxException

后端 未结 10 2024
攒了一身酷
攒了一身酷 2020-11-28 09:22

I got this error message :

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

相关标签:
10条回答
  • 2020-11-28 09:32

    A space is encoded to %20 in URLs, and to + in forms submitted data (content type application/x-www-form-urlencoded). You need the former.

    Using Guava:

    dependencies {
         compile 'com.google.guava:guava:28.1-jre'
    }
    

    You can use UrlEscapers:

    String encodedString = UrlEscapers.urlFragmentEscaper().escape(inputString);
    

    Don't use String.replace, this would only encode the space. Use a library instead.

    0 讨论(0)
  • 2020-11-28 09:34

    If you're using RestangularV2 to post to a spring controller in java you can get this exception if you use RestangularV2.one() instead of RestangularV2.all()

    0 讨论(0)
  • 2020-11-28 09:35

    Rather than encoding the URL beforehand you can do the following

    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();
    
    0 讨论(0)
  • 2020-11-28 09:35

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

    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;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 09:38

    A general solution requires parsing the URL into a RFC 2396 compliant URI (note that this is an old version of the URI standard, which java.net.URI uses).

    I have written a Java URL parsing library that makes this possible: galimatias. With this library, you can achieve your desired behaviour with this code:

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

    Note that galimatias is in a very early stage and some features are experimental, but it is already quite solid for this use case.

    0 讨论(0)
  • 2020-11-28 09:45

    I had this exception in the case of a test for checking some actual accessed URLs by users.

    And the URLs are sometime contains an illegal-character and hang by this error.

    So I make a function to encode only the characters in the URL string like this.

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

    test:

    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)));
    
    0 讨论(0)
提交回复
热议问题