it-swarm.com.de

java.net.MalformedURLException: Kein Protokoll für die URL basierend auf einer mit URLEncoder geänderten Zeichenfolge

Also habe ich versucht, diesen String in einer URL zu verwenden: - 

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

In diesem Code: -

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

Aber an dieser Stelle bekomme ich den Fehler: -

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

Mit etwas Googeln wurde mir klar, dass dies auf die Zeichen in der URL zurückzuführen war (erratene das &). Ich habe dann etwas Code hinzugefügt, sodass es jetzt so aussieht: -

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

Wenn ich dies jedoch ausprobiere, erhalte ich eine Fehlermeldung, wenn ich versuche, die URL zu erstellen. Der Fehler lautet dann: -

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

Anscheinend kann ich die Codierung erst durchführen, nachdem ich die URL erstellt habe. Andernfalls werden Schrägstriche und andere Dinge ersetzt, die nicht verwendet werden sollten. Ich kann jedoch nicht erkennen, wie ich die URL mit der Zeichenfolge erstellen und sie dann formatieren kann es ist für den Gebrauch geeignet. Ich bin mit all dem nicht besonders vertraut und hoffte, dass mir jemand sagen könnte, was mir fehlt, um String A in eine entsprechend formatierte URL zu bringen, die dann mit den korrekten Zeichen ersetzt wird.

Anregungen sehr geschätzt!

23
MorkPork

Sie müssen die Werte Ihrer Parameter codieren, bevor Sie sie mit der URL verknüpfen.
Backslash \ ist ein Sonderzeichen, das als %5C maskiert werden muss.

Fluchtbeispiel:

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

Das Ergebnis ist http://Host.com?param=param%5Cwith%5Cbackslash, das ist eine richtig formatierte URL-Zeichenfolge.

25
m-szalik

Ich habe das gleiche Problem, ich habe die URL mit einer Eigenschaftendatei gelesen:

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"

es sollte sein 

dev.properties

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

ohne "" und mein problem ist gelöst.

Nach Oracle Dokumentation

  • Wird ausgelöst, um anzuzeigen, dass eine fehlerhafte URL aufgetreten ist. Entweder wurde in einer Spezifikationszeichenfolge kein gesetzliches Protokoll oder die Zeichenfolge .__ gefunden. konnte nicht analysiert werden.

Das bedeutet, dass es nicht innerhalb der Zeichenfolge analysiert wird.

4
erhun

Dank der Antwort von Erhun wurde mir endlich klar, dass mein JSON-Mapper die Anführungszeichen um meine Daten herum zurücksendete. Ich musste " asText () " anstelle von "toString ()" verwenden

Es ist kein ungewöhnliches Problem - das Gehirn sieht mit den richtigen Daten nichts falsch - umgeben von Anführungszeichen!

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

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

Sie möchten URI-Vorlagen verwenden . Sehen Sie sich die README dieses Projekts genau an: URLEncoder.encode() funktioniert NICHT für URIs.

Lassen Sie uns Ihre ursprüngliche URL verwenden:

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

und konvertieren Sie es in eine URI-Vorlage mit zwei Variablen (zur besseren Übersichtlichkeit in mehreren Zeilen):

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

Lassen Sie uns nun eine Variablenkarte mit diesen drei Variablen erstellen, indem Sie die im Link erwähnte Bibliothek verwenden:

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

Dies ist GARANTIERT, um eine voll funktionsfähige URL zurückzugeben!

0
fge