Как загрузить содержимое страницы HTML с помощью Spring boot? [Дубликат]

Нет другого выбора, кроме рекурсивной обработки json и создания структуры TreeItem на основе информации элемента.

(Вероятно, есть лучший способ добавить символы, но я не нашел подходящих иконки.)

private static final String INPUT = "{\n"
        + "    name:\"tom\",\n"
        + "    schools:[\n"
        + "        {\n"
        + "            name:\"school1\",\n"
        + "            tags:[\"maths\",\"english\"]\n"
        + "        },\n"
        + "        {\n"
        + "            name:\"school2\",\n"
        + "            tags:[\"english\",\"biological\"]\n"
        + "        },\n"
        + "    ]\n"
        + "}";

private static final Image JSON_IMAGE = new Image("https://i.stack.imgur.com/1slrh.png");

private static void prependString(TreeItem<Value> item, String string) {
    String val = item.getValue().text;
    item.getValue().text = (val == null
            ? string
            : string + " : " + val);
}

private enum Type {
    OBJECT(new Rectangle2D(45, 52, 16, 18)),
    ARRAY(new Rectangle2D(61, 88, 16, 18)),
    PROPERTY(new Rectangle2D(31, 13, 16, 18));

    private final Rectangle2D viewport;

    private Type(Rectangle2D viewport) {
        this.viewport = viewport;
    }

}

private static final class Value {

    private String text;
    private final Type type;

    public Value(Type type) {
        this.type = type;
    }

    public Value(String text, Type type) {
        this.text = text;
        this.type = type;
    }

}

private static TreeItem<Value> createTree(JsonElement element) {
    if (element.isJsonNull()) {
        return new TreeItem<>(new Value("null", Type.PROPERTY));
    } else if (element.isJsonPrimitive()) {
        JsonPrimitive primitive = element.getAsJsonPrimitive();
        return new TreeItem<>(new Value(primitive.isString()
                ? '"' + primitive.getAsString() + '"'
                : primitive.getAsString(), Type.PROPERTY));
    } else if (element.isJsonArray()) {
        JsonArray array = element.getAsJsonArray();
        TreeItem<Value> item = new TreeItem<>(new Value(Type.ARRAY));
       // for (int i = 0, max = Math.min(1, array.size()); i < max; i++) {
        for (int i = 0, max = array.size(); i < max; i++) {
            TreeItem<Value> child = createTree(array.get(i));
            prependString(child, Integer.toString(i));
            item.getChildren().add(child);
        }
        return item;
    } else {
        JsonObject object = element.getAsJsonObject();
        TreeItem<Value> item = new TreeItem<>(new Value(Type.OBJECT));
        for (Map.Entry<String, JsonElement> property : object.entrySet()) {
            TreeItem<Value> child = createTree(property.getValue());
            prependString(child, property.getKey());
            item.getChildren().add(child);
        }
        return item;
    }
}

@Override
public void start(Stage primaryStage) {
    JsonParser parser = new JsonParser();
    JsonElement root = parser.parse(INPUT);

    TreeItem<Value> treeRoot = createTree(root);
    TreeView<Value> treeView = new TreeView<>(treeRoot);
    treeView.setCellFactory(tv -> new TreeCell<Value>() {
        private final ImageView imageView;

        {
            imageView = new ImageView(JSON_IMAGE);
            imageView.setFitHeight(18);
            imageView.setFitWidth(16);
            imageView.setPreserveRatio(true);
            setGraphic(imageView);
        }

        @Override
        protected void updateItem(Value item, boolean empty) {
            super.updateItem(item, empty);

            if (empty || item == null) {
                setText("");
                imageView.setVisible(false);
            } else {
                setText(item.text);
                imageView.setVisible(true);
                imageView.setViewport(item.type.viewport);
            }
        }


    });

    final Scene scene = new Scene(treeView);

    primaryStage.setScene(scene);
    primaryStage.show();
}
127
задан Eric Leschinski 30 May 2016 в 19:26
поделиться

8 ответов

Теперь, когда прошло некоторое время с момента принятия первоначального ответа, есть лучший подход:

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() : "";
    }
}
107
ответ дан ccleve 3 September 2018 в 18:12
поделиться

Следующее работает с Java 7/8, защищенными URL-адресами и показывает, как добавить cookie к вашему запросу. Обратите внимание, что это в основном прямая копия этого другого замечательного ответа на этой странице , но добавлен пример файла cookie и пояснения в том, что он также работает с защищенными URL-адресами ;-)

Если вам необходимо подключиться к серверу с недопустимым сертификатом или самоподписанным сертификатом, это приведет к появлению ошибок безопасности, если вы не импортируете сертификат. Если вам нужна эта функциональность, вы можете рассмотреть подход, подробно описанный в этом ответе к этому связанному с вопросу о StackOverflow.

Пример

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);
    }
}
3
ответ дан Community 3 September 2018 в 18:12
поделиться
63
ответ дан davidsheldon 3 September 2018 в 18:12
поделиться

Если у вас есть входной поток (см. ответ Джо), также рассмотрите ioutils.toString (входной поток).

http://commons.apache.org/io/api-1.4/org /apache/commons/io/IOUtils.html#toString(java.io.InputStream)

4
ответ дан extraneon 3 September 2018 в 18:12
поделиться

Теперь, когда прошло больше времени, вот как это сделать в 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"));
}
16
ответ дан Hat 3 September 2018 в 18:12
поделиться

Этот ответ относится к более старой версии 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);
 }
92
ответ дан matt 3 September 2018 в 18:12
поделиться

Есть еще лучший способ с Java 9: ​​

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 и использовать его для определения кодировки.)

6
ответ дан Sean Reilly 3 September 2018 в 18:12
поделиться

Дополнительный пример с использованием Guava:

URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
9
ответ дан takacsot 3 September 2018 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: