我试图找到 Java 与 Groovy 的等价物:
String content = "http://www.google.com".toURL().getText();
我想把内容从 URL 读入字符串。我不想为这样一个简单的任务使用缓冲流和循环来污染我的代码。我查看了 apache 的 HttpClient,但也没有看到一两行的实现。
这个答案指的是 Java 的一个旧版本,你可能想看看 ccleve 的答案。
这里有一个传统的方法:
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); } }
正如@extraneon 所建议的,Ioutils允许您以一种非常有说服力的方式完成这项工作,这种方式仍然保留着 Java 的精神:
InputStream in = new URL( "http://jakarta.apache.org" ).openStream(); try { System.out.println( IOUtils.toString( in ) ); } finally { IOUtils.closeQuietly(in); }
如果您有输入流(参见 Joe 的答案) ,也可以考虑 ioutils.toString (inputstream)。
Http://commons.apache.org/io/api-1.4/org/apache/commons/io/ioutils.html#tostring (java.io. inputStream )
现在距离最初的答案被接受已经过去了一段时间,有一个更好的方法:
String out = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("\\A").next();
如果您想要一个稍微完整一点的实现,而不是一行,那么可以这样做:
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() : ""; } }
或者只使用 ApacheCommons IOUtils.toString(URL url),或者也接受编码参数的变体。
IOUtils.toString(URL url)
使用番石榴的附加例子:
URL xmlData = ... String data = Resources.toString(xmlData, Charsets.UTF_8);
现在时间已经过去了,这里有一个在 Java8中实现它的方法:
URLConnection conn = url.openConnection(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { pageText = reader.lines().collect(Collectors.joining("\n")); }
以下内容适用于 Java7/8,保护 url,并显示了如何向请求中添加 cookie。注意,这主要是 这一页上的另一个伟大的答案的一个直接副本,但是添加了 cookie 示例,并澄清了它也适用于安全 URL; -)
如果需要连接到具有无效证书或自签名证书的服务器,则将引发安全性错误,除非导入证书。如果你需要这个功能,你可以 考虑一下这个答案中详细描述的方法到这个 关于堆栈溢出的相关问题。
String result = getUrlAsString("https://www.google.com"); System.out.println(result);
输出
<!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); } }
对于 Java9,还有一种更好的方法:
URL u = new URL("http://www.example.com/"); try (InputStream in = u.openStream()) { return new String(in.readAllBytes(), StandardCharsets.UTF_8); }
与最初的 groovy 示例一样,这里假设内容是 UTF-8编码的。(如果需要更聪明的方法,则需要创建一个 URLConnection 并使用它来确定编码。)
以下是珍妮可爱的回答,但对于像我这样的木偶来说,它包含了一个简洁的功能:
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; }
示例调用 从 http get call 获取有效负载
String str = getStringFromUrl("YourUrl");
实施
您可以在 如何将 URL 读取到 InputStream上使用这个答案中描述的方法,并在 如何将 InputStream 读取到 String上将其与这个答案结合起来。
结果会是这样的
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); } }
优点
这是纯咖啡
通过添加不同的头作为映射(而不是像上面的例子那样传递空对象)、身份验证等,可以很容易地增强它。
支持协议交换机的处理
Java11 + :
URI uri = URI.create("http://www.google.com"); HttpRequest request = HttpRequest.newBuilder(uri).build(); String content = HttpClient.newHttpClient().send(request, BodyHandlers.ofString()).body();