java.net.MalformedURLException: no protocol on URL based on a string modified with URLEncoder

后端 未结 5 937
终归单人心
终归单人心 2020-12-08 19:20

So I was attempting to use this String in a URL :-

http://site-test.com/Meetings/IC/DownloadDocument?meetingId=c21c905c-8359-4bd6-b864-844709e05754&item         


        
相关标签:
5条回答
  • 2020-12-08 20:05

    You need to encode your parameter's values before concatenating them to URL.
    Backslash \ is special character which have to be escaped as %5C

    Escaping example:

    String paramValue = "param\\with\\backslash";
    String yourURLStr = "http://host.com?param=" + java.net.URLEncoder.encode(paramValue, "UTF-8");
    java.net.URL url = new java.net.URL(yourURLStr);
    

    The result is http://host.com?param=param%5Cwith%5Cbackslash which is properly formatted url string.

    0 讨论(0)
  • 2020-12-08 20:06

    I have the same problem, i read the url with an properties file:

    String configFile = System.getenv("system.Environment");
            if (configFile == null || "".equalsIgnoreCase(configFile.trim())) {
                configFile = "dev.properties";
            }
            // Load properties 
            Properties properties = new Properties();
            properties.load(getClass().getResourceAsStream("/" + configFile));
           //read url from file
            apiUrl = properties.getProperty("url").trim();
                URL url = new URL(apiUrl);
                //throw exception here
        URLConnection conn = url.openConnection();
    

    dev.properties

    url = "https://myDevServer.com/dev/api/gate"
    

    it should be

    dev.properties

    url = https://myDevServer.com/dev/api/gate
    

    without "" and my problem is solved.

    According to oracle documentation

    • Thrown to indicate that a malformed URL has occurred. Either no legal protocol could be found in a specification string or the string could not be parsed.

    So it means it is not parsed inside the string.

    0 讨论(0)
  • 2020-12-08 20:16

    Thanks to Erhun's answer I finally realised that my JSON mapper was returning the quotation marks around my data too! I needed to use "asText()" instead of "toString()"

    It's not an uncommon issue - one's brain doesn't see anything wrong with the correct data, surrounded by quotes!

    discoveryJson.path("some_endpoint").toString();
    "https://what.the.com/heck"
    
    discoveryJson.path("some_endpoint").asText();
    https://what.the.com/heck
    
    0 讨论(0)
  • 2020-12-08 20:18

    This code worked for me

    public static void main(String[] args) {
        try {
            java.net.URL myUr = new java.net.URL("http://path");
            System.out.println("Instantiated new URL: " + connection_url);
        }
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
    

    Instantiated new URL: http://path

    0 讨论(0)
  • 2020-12-08 20:21

    You want to use URI templates. Look carefully at the README of this project: URLEncoder.encode() does NOT work for URIs.

    Let us take your original URL:

    http://site-test.test.com/Meetings/IC/DownloadDocument?meetingId=c21c905c-8359-4bd6-b864-844709e05754&itemId=a4b724d1-282e-4b36-9d16-d619a807ba67&file=\s604132shvw140\Test-Documents\c21c905c-8359-4bd6-b864-844709e05754_attachments\7e89c3cb-ce53-4a04-a9ee-1a584e157987\myDoc.pdf

    and convert it to a URI template with two variables (on multiple lines for clarity):

    http://site-test.test.com/Meetings/IC/DownloadDocument
        ?meetingId={meetingID}&itemId={itemID}&file={file}
    

    Now let us build a variable map with these three variables using the library mentioned in the link:

    final VariableMap = VariableMap.newBuilder()
        .addScalarValue("meetingID", "c21c905c-8359-4bd6-b864-844709e05754")
        .addScalarValue("itemID", "a4b724d1-282e-4b36-9d16-d619a807ba67e")
        .addScalarValue("file", "\\\\s604132shvw140\\Test-Documents"
            + "\\c21c905c-8359-4bd6-b864-844709e05754_attachments"
            + "\\7e89c3cb-ce53-4a04-a9ee-1a584e157987\\myDoc.pdf")
        .build();
    
    final URITemplate template
        = new URITemplate("http://site-test.test.com/Meetings/IC/DownloadDocument"
            + "meetingId={meetingID}&itemId={itemID}&file={file}");
    
    // Generate URL as a String
    final String theURL = template.expand(vars);
    

    This is GUARANTEED to return a fully functional URL!

    0 讨论(0)
提交回复
热议问题