net - url java 8
Construyendo una URL absoluta a partir de una URL relativa en Java (4)
Este código funcionará en Linux , solo puede combinar la ruta . Si desea más, el constructor de URI podría ser útil.
URL baseUrl = new URL("http://example.com/first");
URL targetUrl = new URL(baseUrl, Paths.get(baseUrl.getPath(), "second", "/third", "//fourth//", "fifth").toString());
Si la ruta contiene algo que necesita escapar, use URLEncoder.encode
para escapar de él al principio.
URL baseUrl = new URL("http://example.com/first");
URL targetUrl = new URL(baseUrl, Paths.get(baseUrl.getPath(), URLEncoder.encode(relativePath, StandardCharsets.UTF_8), URLEncoder.encode(filename, StandardCharsets.UTF_8)).toString());
ejemplo:
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
try {
URL baseUrl = new URL("http://example.com/first");
Path relativePath = Paths.get(baseUrl.getPath(), "second", "/third", "//fourth//", "fifth");
URL targetUrl = new URL(baseUrl, relativePath.toString());
System.out.println(targetUrl.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
salida
http://example.com/first/second/third/fourth/fifth
baseUrl.getPath()
son muy importantes, no lo olvides.
un mal ejemplo:
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
try {
URL baseUrl = new URL("http://example.com/first");
Path relativePath = Paths.get("second", "/third", "//fourth//", "fifth");
URL targetUrl = new URL(baseUrl, relativePath.toString());
System.out.println(targetUrl.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
salida
http://example.com/second/third/fourth/fifth
Hemos perdido nuestro /first
en baseurl.
Tengo problemas para crear una URL absoluta a partir de una URL relativa sin tener que recurrir a String hackery ...
Dado
http://localhost:8080/myWebApp/someServlet
Dentro del método:
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
¿Cuál es la forma más "correcta" de construir:
http://localhost:8080/myWebApp/someImage.jpg
(Nota, debe ser absoluta, no relativa)
Actualmente, lo estoy haciendo a través de la construcción de la cadena, pero DEBE haber una mejor manera.
He visto varias combinaciones de nuevos URI / URL, y termino con
http://localhost:8080/someImage.jpg
Ayuda muy apreciada
Parece que ya te diste cuenta de la parte difícil, que es en qué host estás ejecutando. El resto es fácil,
String url = host + request.getContextPath() + "/someImage.jpg";
Debería darte lo que necesitas.
Qué tal si:
String s = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/someImage.jpg";
Utilizando java.net.URL
URL baseUrl = new URL("http://www.google.com/someFolder/");
URL url = new URL(baseUrl, "../test.html");