J'essaie de trouver l'équivalent Java de Groovy:
String content = "http://www.google.com".toURL().getText();
Je veux lire le contenu d'une URL en chaîne. Je ne veux pas polluer mon code avec des flux et des boucles en mémoire tampon pour une tâche aussi simple. J'ai examiné le HttpClient d'Apache mais je ne vois pas non plus d'implémentation sur une ou deux lignes.
Maintenant que la réponse initiale a été acceptée avec un certain temps, il existe une meilleure approche:
String out = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("\\A").next();
Si vous souhaitez une mise en œuvre légèrement plus complète, qui ne correspond pas à une seule ligne, procédez comme suit:
public static String readStringFromURL(String requestURL) throws IOException
{
try (Scanner scanner = new Scanner(new URL(requestURL).openStream(),
StandardCharsets.UTF_8.toString()))
{
scanner.useDelimiter("\\A");
return scanner.hasNext() ? scanner.next() : "";
}
}
Cette réponse fait référence à une ancienne version de Java. Vous voudrez peut-être regarder la réponse de Ccleve.
Voici la manière traditionnelle de faire ceci:
import Java.net.*;
import Java.io.*;
public class URLConnectionReader {
public static String getText(String url) throws Exception {
URL website = new URL(url);
URLConnection connection = website.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null)
response.append(inputLine);
in.close();
return response.toString();
}
public static void main(String[] args) throws Exception {
String content = URLConnectionReader.getText(args[0]);
System.out.println(content);
}
}
Comme @extraneon l'a suggéré, ioutils vous permet de le faire d'une manière très éloquente et toujours dans l'esprit Java:
InputStream in = new URL( "http://jakarta.Apache.org" ).openStream();
try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}
Ou utilisez simplement IOUtils.toString(URL url)
, ou la variante qui accepte également un paramètre de codage.
Maintenant que plus de temps a passé, voici une façon de le faire dans Java 8:
URLConnection conn = url.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
pageText = reader.lines().collect(Collectors.joining("\n"));
}
Exemple supplémentaire d'utilisation de goyave:
URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
Il existe une méthode encore meilleure à partir de Java 9:
URL u = new URL("http://www.example.com/");
try (InputStream in = u.openStream()) {
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
Comme dans l'exemple groovy d'origine, cela suppose que le contenu est codé en UTF-8. (Si vous avez besoin de quelque chose de plus intelligent, vous devez créer une connexion URLConnection et l'utiliser pour déterminer le codage.)
Si vous avez le flux d'entrée (voir la réponse de Joe), considérez également ioutils.toString (flux d'entrée).
http://commons.Apache.org/io/api-1.4/org/Apache/commons/io/IOUtils.html#toString(Java.io.InputStream )
Ce qui suit fonctionne avec Java 7/8, les URL sécurisées et montre également comment ajouter un cookie à votre demande. Notez que ceci est principalement une copie directe de cette autre excellente réponse sur cette page , mais a ajouté l’exemple de cookie et une précision en ce sens que cela fonctionne également avec les URL sécurisées ;-)
Si vous devez vous connecter à un serveur avec un certificat non valide ou un certificat auto-signé, cela générera des erreurs de sécurité, sauf si vous importez le certificat. Si vous avez besoin de cette fonctionnalité, vous pouvez envisager l’approche détaillée dans cette réponse à cette question relative à StackOverflow.
String result = getUrlAsString("https://www.google.com");
System.out.println(result);
les sorties
<!doctype html><html itemscope="" .... etc
import Java.net.URL;
import Java.net.URLConnection;
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
public static String getUrlAsString(String url)
{
try
{
URL urlObj = new URL(url);
URLConnection con = urlObj.openConnection();
con.setDoOutput(true); // we want the response
con.setRequestProperty("Cookie", "myCookie=test123");
con.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
String newLine = System.getProperty("line.separator");
while ((inputLine = in.readLine()) != null)
{
response.append(inputLine + newLine);
}
in.close();
return response.toString();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
Voici la belle réponse de Jeanne, mais enveloppée dans une fonction de rangement pour des muppets comme moi:
private static String getUrl(String aUrl) throws MalformedURLException, IOException
{
String urlData = "";
URL urlObj = new URL(aUrl);
URLConnection conn = urlObj.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)))
{
urlData = reader.lines().collect(Collectors.joining("\n"));
}
return urlData;
}
Exemple d'appel
String str = getStringFromUrl("YourUrl");
La mise en oeuvre
Vous pouvez utiliser la méthode décrite dans cette réponse, sur Comment lire une URL vers un InputStream et la combiner avec cette réponse sur Comment lire InputStream en String .
Le résultat sera quelque chose comme
public String getStringFromUrl(URL url) throws IOException {
return inputStreamToString(urlToInputStream(url,null));
}
public String inputStreamToString(InputStream inputStream) throws IOException {
try(ByteArrayOutputStream result = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString(UTF_8);
}
}
private InputStream urlToInputStream(URL url, Map<String, String> args) {
HttpURLConnection con = null;
InputStream inputStream = null;
try {
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(15000);
con.setReadTimeout(15000);
if (args != null) {
for (Entry<String, String> e : args.entrySet()) {
con.setRequestProperty(e.getKey(), e.getValue());
}
}
con.connect();
int responseCode = con.getResponseCode();
/* By default the connection will follow redirects. The following
* block is only entered if the implementation of HttpURLConnection
* does not perform the redirect. The exact behavior depends to
* the actual implementation (e.g. Sun.net).
* !!! Attention: This block allows the connection to
* switch protocols (e.g. HTTP to HTTPS), which is <b>not</b>
* default behavior. See: https://stackoverflow.com/questions/1884230
* for more info!!!
*/
if (responseCode < 400 && responseCode > 299) {
String redirectUrl = con.getHeaderField("Location");
try {
URL newUrl = new URL(redirectUrl);
return urlToInputStream(newUrl, args);
} catch (MalformedURLException e) {
URL newUrl = new URL(url.getProtocol() + "://" + url.getHost() + redirectUrl);
return urlToInputStream(newUrl, args);
}
}
/*!!!!!*/
inputStream = con.getInputStream();
return inputStream;
} catch (Exception e) {
throw new RuntimeException(e);
}
}