java.net.MalformedURLException:基于使用URLEncoder修改的字符串,URL上没有协议

Mor*_*ork 29 java uri malformedurlexception

所以我试图在URL中使用这个字符串: -

http://site-test.collercapital.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
Run Code Online (Sandbox Code Playgroud)

在这段代码中: -

String fileToDownloadLocation = //The above string
URL fileToDownload = new URL(fileToDownloadLocation);
HttpGet httpget = new HttpGet(fileToDownload.toURI());
Run Code Online (Sandbox Code Playgroud)

但在这一点上我得到错误: -

java.net.URISyntaxException: Illegal character in query at index 169:Blahblahblah
Run Code Online (Sandbox Code Playgroud)

我通过一些谷歌搜索意识到这是由于URL中的字符(猜测&),所以我在一些代码中添加,所以它现在看起来像这样: -

String fileToDownloadLocation = //The above string
fileToDownloadLocation = URLEncoder.encode(fileToDownloadLocation, "UTF-8");
URL fileToDownload = new URL(fileToDownloadLocation);
HttpGet httpget = new HttpGet(fileToDownload.toURI());
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行它时,当我尝试创建URL时出现错误,然后错误如下: -

java.net.MalformedURLException: no protocol: http%3A%2F%2Fsite-test.collercapital.com%2FMeetings%2FIC%2FDownloadDocument%3FmeetingId%3Dc21c905c-8359-4bd6-b864-844709e05754%26itemId%3Da4b724d1-282e-4b36-9d16-d619a807ba67%26file%3D%5C%5Cs604132shvw140%5CTest-Documents%5Cc21c905c-8359-4bd6-b864-844709e05754_attachments%5C7e89c3cb-ce53-4a04-a9ee-1a584e157987%myDoc.pdf
Run Code Online (Sandbox Code Playgroud)

在我创建了URL之后看起来我不能进行编码,否则它会替换斜杠和不应该的东西,但是我看不出如何用字符串创建URL然后将其格式化它适合使用.我对这一切并不是特别熟悉,并希望有人能够指出我错过了将字符串A放入适当格式化的URL然后使用正确的字符替换?

任何建议都非常感谢!

m-s*_*lik 25

您需要在将参数的值连接到URL之前对其进行编码.
反斜杠\是特殊字符,必须转义为%5C

逃避的例子:

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);
Run Code Online (Sandbox Code Playgroud)

结果是http://host.com?param=param%5Cwith%5Cbackslash正确格式化的url字符串.

  • 这对带有空格的文件不起作用......同样,URLEncoder.encode()不适用于URI! (2认同)

erh*_*hun 7

我有同样的问题,我用属性文件读取了 url:

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();
Run Code Online (Sandbox Code Playgroud)

开发属性

url = "https://myDevServer.com/dev/api/gate"
Run Code Online (Sandbox Code Playgroud)

它应该是

开发属性

url = https://myDevServer.com/dev/api/gate
Run Code Online (Sandbox Code Playgroud)

没有“”,我的问题就解决了。

根据oracle文档

  • 抛出以指示发生了格式错误的 URL。在规范字符串中找不到合法协议或无法解析字符串。

所以这意味着它没有在字符串内解析。