java. net. MalformedURLException: aucun protocole sur L'URL basé sur une chaîne modifiée avec URLEncoder

J'essayais donc d'utiliser cette chaîne dans une URL: -

http://site-test.collercapital.com/Meetings/IC/DownloadDocument?meetingId=c21c905c-8359-4bd6-b864-844709e05754&itemId=a4b724d1-282e-4b36-9d16-d619a807ba67&file=\s604132shvw140Test-Documentsc21c905c-8359-4bd6-b864-844709e05754_attachments7e89c3cb-ce53-4a04-a9ee-1a584e157987myDoc.pdf

Dans ce code: -

String fileToDownloadLocation = //The above string
URL fileToDownload = new URL(fileToDownloadLocation);
HttpGet httpget = new HttpGet(fileToDownload.toURI());

Mais à ce stade, je reçois l'erreur: -

java.net.URISyntaxException: Illegal character in query at index 169:Blahblahblah

J'ai réalisé avec un peu de googling que c'était dû aux caractères dans L'URL (deviner le&), alors j'ai ensuite ajouté du code pour qu'il ressemble maintenant à ceci: -

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

Cependant, lorsque j'essaie d'exécuter ce que j'obtiens une erreur lorsque je tente de créer l'URL, l'erreur de lit ensuite: -

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

Il semble que je ne puisse pas faire l'encodage jusqu'à ce que j'ai créé l'URL sinon il remplace les barres obliques et les choses qu'il ne devrait pas, mais je ne vois pas comment je peux créer l'URL avec la chaîne, puis le formater pour qu'il soit approprié pour une utilisation. Je ne suis pas particulièrement familier avec tout cela et espérais que quelqu'un pourrait être en mesure de me signaler ce qui me manque pour obtenir la chaîne A dans une URL convenablement formatée pour ensuite l'utiliser avec les caractères corrects remplacés?

Toutes les suggestions grandement apprécié!

22
demandé sur MorkPork 2014-02-28 15:26:06

3 réponses

Vous devez encoder les valeurs de votre paramètre avant de les concaténer en URL.
La barre oblique inverse \ est un caractère spécial qui doit être échappé comme %5C

Exemple D'échappement:

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

Le résultat est http://host.com?param=param%5Cwith%5Cbackslash qui est une chaîne d'url correctement formatée.

23
répondu m-szalik 2014-02-28 12:16:51

J'ai le même problème, j'ai lu l'url avec un fichier de propriétés:

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.propriétés

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

, Il devrait être

Dev.propriétés

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

, "Sans" et mon problème est résolu.

Selon oracle documentation

  • lancé pour indiquer qu'une URL malformée s'est produite. Soit aucun protocole légal n'a pu être trouvé dans une chaîne de spécification ou la chaîne n'a pas pu être analysée.

Donc il signifie qu'il n'est pas analysé à l'intérieur de la chaîne.

4
répondu erhun 2016-03-14 12:53:41

Vous souhaitez utiliser modèles D'URI . Regardez attentivement le README de ce projet: URLEncoder.encode() ne fonctionne pas pour les URI.

Prenons votre URL d'origine:

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

Et convertissez-le en un modèle D'URI avec deux variables (sur plusieurs lignes pour plus de clarté):

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

Maintenant, construisons une carte de variables avec ces trois variables en utilisant la bibliothèque mentionnée dans le lien:

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.collercapital.com/Meetings/IC/DownloadDocument"
        + "meetingId={meetingID}&itemId={itemID}&file={file}");

// Generate URL as a String
final String theURL = template.expand(vars);

Ceci est garanti pour retourner une URL entièrement fonctionnelle!

0
répondu fge 2014-02-28 13:09:58