2014-02-28 7 views
16

Also ich versuche, diesen String in einer URL zu verwenden: -java.net.MalformedURLException: kein Protokoll auf URL basierend auf einer Schnur mit URLEncoder modifizierte

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 diesem Punkt habe ich den Fehler: -

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

ich mit etwas erkennen dies googeln war in der UR auf die Zeichen durch L (Erraten der &), so dass ich dann in einigen Code hinzugefügt, so sieht es jetzt wie folgt: -

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

aber wenn ich versuche, und führen Sie diese ich einen Fehler, wenn ich versuche, und die URL erstellen, die 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 

es sieht aus wie ich nicht die Codierung tun kann, bis, nachdem ich die URL erstellt haben sonst es Hiebe und Dinge ersetzt, die es sollte nicht, aber ich kann nicht sehen, wie ich kann die URL mit der Zeichenfolge erstellen und sie dann so formatieren, dass sie für die Verwendung geeignet ist. Ich bin nicht besonders vertraut mit all dem und hoffte, dass jemand in der Lage sein könnte, mir zu zeigen, was ich vermisse, um String A in eine passend formatierte URL zu bekommen, um sie dann mit den richtigen Zeichen zu ersetzen?

Alle Vorschläge sehr geschätzt!

+0

'URLEncoder.encode()' funktioniert nicht für URIs! Sie möchten [URI-Vorlagen] (https://github.com/fge/uri-template) <- diese Bibliothek kann helfen. – fge

Antwort

21

Sie müssen die Werte Ihres Parameters codieren, bevor Sie sie mit URL verketten.
Aufkantung \ ist Sonderzeichen, die als %5C

Escaping Beispiel entkam werden müssen:

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 die richtig URL-String formatiert ist.

+0

Danke für die Erinnerung an die Sonderzeichen! Ich fügte in der Zeile 'fileToDownloadLocation = fileToDownloadLocation.replace (" \\ ","% 5C ");' und hey presto alles ist wieder gut, schöne und einfache Lösung, um mich zu überschwemmen, Prost! :) – MorkPork

+1

Dies funktioniert nicht für Dateien mit Leerzeichen ... Auch hier funktioniert URLEncoder.encode() NICHT für URIs! – fge

+0

Leerzeichen wird durch Pluszeichen "+" ersetzt. Das ist richtiges Entkommen für URLs. –

0

Sie möchten URI templates verwenden. Sehen Sie sich die README dieses Projekts genau an: funktioniert NICHT für URIs.

Lassen Sie uns Ihre ursprüngliche URL nehmen:

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

und es zu einer Vorlage URI konvertieren mit zwei Variablen (auf mehrere Zeilen für Klarheit):

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

Nun lassen Sie uns eine variable Karte bauen mit diesen drei Variablen unter Verwendung der Bibliothek in der Verbindung erwähnt:

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 GARANTIE D um eine voll funktionsfähige URL zurückzugeben!

+0

Danke für die ausführliche Antwort, ich nehme an, wenn ich das implementieren wollte, müsste ich die Sachen von Github etc herunterladen, die ich untersuchen werde, Prost! – MorkPork

3

Ich habe das gleiche Problem, ich lese die URL mit einer Properties-Datei:

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.

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

es

dev.properties sollte

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

ohne "" und mein Problem gelöst ist.

Nach Orakel 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 bedeutet es nicht innerhalb der Zeichenfolge analysiert wird.