Sisendi lugemine veebist

URL'i parsimine

URL klass pakub kasutajatele mitmeid erinevaid meetodeid, mis lubavad teha päringuid URL objektide kohta. Sellistelt objektidelt võib küsida nende protokolli, host'i nime, pordi numbrit, authority't, päringut, faili nime, path'i ning viidet.

Selleks on meetodid:

  • getProtocol() - tagastab URL'i protokolli nime

  • getAuthority() - tagastab URL'i authority komponendi

  • getHost() - tagastab URL'i võõrustaja nime

  • getPort() - tagastab Integer'i kujul pordi numbri, juhul kui see puudub tagastab -1

  • getPath() - tagastab URL'i path komponendi

  • getQuery() - tagastab URL'i päringu komponendi

  • getFile() - tagastab path komponendi ning getQuery() väärtuse, kui see on olemas

  • getRef() - tagastab URL'i reference komponendi

Oluline on meeles pidada, et iga URL ei sisalda kõiki eelloetletud komponente, need meetodid on olemas, sest tihti kasutatakse URL'e, milles sisalduvad mõned või kõik nendest komponentidest. URL klass on üpris HTTP keskne.

Koodinäide:

import java.net.*;
import java.io.*;

public class ParseURL {
    public static void main(String[] args) throws Exception {

        // How we did it before it was deprecated in Java 20
        URL deprecatedURL = new URL("http://example.com:80/docs/books/tutorial"
                        + "/index.html?name=networking#DOWNLOADING");

        // Now we do it like this
        URL aURL = new URI("http://example.com:80/docs/books/tutorial"
                        + "/index.html?name=networking#DOWNLOADING").toURL();

        System.out.println("protocol = " + aURL.getProtocol());
        System.out.println("authority = " + aURL.getAuthority());
        System.out.println("host = " + aURL.getHost());
        System.out.println("port = " + aURL.getPort());
        System.out.println("path = " + aURL.getPath());
        System.out.println("query = " + aURL.getQuery());
        System.out.println("filename = " + aURL.getFile());
        System.out.println("ref = " + aURL.getRef());
    }
}

Koodinäide tagastab:

protocol = http
authority = example.com:80
host = example.com
port = 80
path = /docs/books/tutorial/index.html
query = name=networking
filename = /docs/books/tutorial/index.html?name=networking
ref = DOWNLOADING

URL'ilt HTML-i lugemine

URL'i kohta saab välja kutsuda meetodi openStream(), mis loob voo, millest saab URL'i sisu välja lugeda. openStream() meetod tagastab java.io.InputStream objekti, seega on URL'ilt lugemine sarnane näiteks failist andmete lugemisega.

Järgnev koodinäide kasutab openStream() meetodit, et saada sisendvoog URL'ist https://www.oracle.com/. Seejärel kasutatakse BufferedReader'it, et lugeda vajalikku infot. Kõik, mis loetakse sisse, kopeeritakse output voogu.

import java.net.*;
import java.io.*;

public class URLReader {
    public static void main(String[] args) throws Exception {

        URL url = new URI("https://www.oracle.com/").toURL();

        BufferedReader in = new BufferedReader(
        new InputStreamReader(url.openStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);
        in.close();
    }
}

Kui panna antud kood tööle, peaks nägema konsoolis veebilehe https://www.oracle.com/ HTML koodi ning tekstilist sisu; juhul kui ei suudeta leida Oracle'i serverit või URL'i lugemisel tekib mõni muu viga, kuvatakse terminalis hoopis veateadet.

HTTP päringu tegemine

Kui on soov teha andmevahetust rakenduse ja mingi veebiserveri vahel, siis selle jaoks eelmisest näitest ei piisa. Järgmises näites toome välja, kuidas koostada HTTP päringut Javas, et APIst pärida andmeid JSON kujul. HTTP abil saame määrata päringu täpse tüübi, mille abil vastuvõtja saab otsustada, mida sellega teha ning mida meile tagastada (nt: GET päringuga saame andmeid, POST päringuga lisame andmeid).

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

public class URLReader {

    private static final String API_URL = "https://api.sampleapis.com/beers/ale";
    private static final String COOKIES = "";

    public static void main(String[] args) throws IOException, URISyntaxException {

        // Create URL and open a connection to it
        URL url = new URI(API_URL).toURL();
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // An example of some set methods in HttpURLConnection, most are inherited from URLConnection. There are alot more.

        connection.setRequestMethod("GET");                                 // Sets HTTP request method (GET, POST, PUT, DELETE - few examples)
        connection.setRequestProperty("Content-Type", "application/json");  // Sets request properties (ie. for this instance we tell what content-type we are using)
        connection.setConnectTimeout(5000);                                 // Sets connection timeout time in milliseconds
        connection.setReadTimeout(5000);                                    // Sets read timeout time in milliseconds
        connection.setDoOutput(true);                                       // Declare that we intend to get output from this connection
        connection.setRequestProperty("Cookie", COOKIES);                   // Set any other properites needed by the connection (Cookies? Bearer?)

        // Open an inputStream from connection and read it into a string buffer
        String line;
        StringBuilder result = new StringBuilder();
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(connection.getInputStream()));

        while ((line = reader.readLine()) != null) {
            result.append(line);
        }

        // Remember to close readers/connections
        reader.close();
        connection.disconnect();

        System.out.println(result);
    }
}

Koodi tööle pannes saame vastuseks JSON-i massiivi sõnena. Seda saab edasi töödelda teekidega nagu näiteks Google Gson (näiteks fromJson() meetodiga või kasutades JsonParser-it). Loe sellest lähemalt siit: JSON Failide käsitlemine