web-dev-qa-db-fra.com

java.net.MalformedURLException: pas de 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=\\s604132shvw140\Test-Documents\c21c905c-8359-4bd6-b864-844709e05754_attachments\7e89c3cb-ce53-4a04-a9ee-1a584e157987\myDoc.pdf

Dans ce code: -

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

Mais à ce stade, j'obtiens l'erreur: -

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

J'ai réalisé avec un peu de google que c'était dû aux caractères de l'URL (devinant le &), alors j'ai ensuite ajouté du code afin 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 de l'exécuter, j'obtiens une erreur lorsque j'essaie de créer l'URL. Cette erreur se lit alors comme suit: -

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 avant d'avoir créé l'URL, sinon il remplace les barres obliques et tout ce qui ne devrait pas, mais je ne vois pas comment je peux créer l'URL avec la chaîne, puis la formater de manière à son approprié pour l'utilisation. Je ne suis pas particulièrement au courant de tout cela et espérais que quelqu'un pourrait me montrer ce qu'il me manque pour insérer la chaîne A dans une URL formatée de façon à pouvoir l'utiliser avec les bons caractères remplacés?

Toutes les suggestions grandement appréciées!

23
MorkPork

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

Exemple d'évasion:

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.

25
m-szalik

J'ai le même problème, je lis 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.properties

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

cA devrait etre 

dev.properties

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

sans "" et mon problème est résolu.

Selon Oracle documentation

  • Lancé pour indiquer qu'une URL mal formée s'est produite. Aucun protocole légal n'a pu être trouvé dans une chaîne de spécification ou dans la chaîne ne pouvait pas être analysé.

Cela signifie donc que ce n'est pas analysé à l'intérieur de la chaîne.

4
erhun

Grâce à la réponse d'Erhun, j'ai enfin compris que mon mappeur JSON renvoyait également les guillemets autour de mes données! J'avais besoin d'utiliser " asText () " au lieu de "toString ()"

Ce n'est pas un problème rare - son cerveau ne voit rien d'anormal avec les données correctes, entouré de guillemets!

discoveryJson.path("some_endpoint").toString();
"https://what.the.com/heck"

discoveryJson.path("some_endpoint").asText();
https://what.the.com/heck
0
Dave

Vous voulez utiliser Modèles d'URI . Examinez attentivement le README de ce projet: URLEncoder.encode() ne fonctionne PAS pour les URI.

Laissez-nous prendre votre URL d'origine:

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

Construisons maintenant 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 renvoyer une URL entièrement fonctionnelle!

0
fge