Java – Avviare ricerca internet con il browser predefinito

In una applicazione Java “desktop” di tipo grafico (o al limite una applicazione “console”) potrebbe essere necessario, in qualche caso, lanciare un browser esterno per aprire la pagina con i risultati della ricerca su internet fatta tramite uno specifico “motore di ricerca” (es. Google o Bing, giusto per citarne due noti).

La possibilità per farlo esiste. Per arrivare alla soluzione descritta in questo articolo, bisogna però prima stabilire alcuni “vincoli”:

  1. è sufficiente/accettabile aprire il browser “predefinito”, qualunque esso sia in base alla impostazione fatta dall’utente sulla sua macchina
  2. è accettabile dover conoscere a priori e impostare all’interno del codice (o al limite renderlo “configurabile”) l’indirizzo completo di un motore di ricerca (es. Google o Bing) per eseguire una ricerca e arrivare subito alla pagina dei primi risultati
  3. è possibile usare almeno Java 6 (scenario abbastanza facile e ragionevole al giorno d’oggi)

Se tutte queste premesse sono soddisfatte, allora possiamo procedere in maniera abbastanza semplice e lineare. Il punto 1 (grazie anche al punto 3) infatti ci dà la libertà di sfruttare il metodo browse(URI) della classe java.awt.Desktop.

Desktop è una classe del framework AWT che è stata introdotta molto tempo fa in Java 6 per poter facilitare l’avvio di quelle applicazioni che vengono registrate nel sistema per essere “associate” a determinati tipi di file o di url. Se ad esempio su Windows l’estensione di file .txt è stata associata al ben noto editor di testo Notepad++, allora se al metodo open(File) di Desktop si passa un java.io.File che rappresenta un file .txt esistente, esso verrà aperto proprio con Notepad++.

Il metodo browse di Desktop si occupa di lanciare il browser “predefinito” per far aprire la pagina il cui url è rappresentato da un oggetto java.net.URI (per il concetto di URI in generale vedere Uniform Resource Identifier su Wikipedia).

Riguardo il punto 2 bisogna quindi scegliere innanzitutto un determinato motore di ricerca. In questo articolo descriverò cosa fare per i due motori di ricerca Google e Bing che tra l’altro, al momento attuale, hanno una struttura dell’url di ricerca che è praticamente similare.

Per Google l’url di ricerca basilare è: https://www.google.com/search?q=testo+di+ricerca
Per Bing l’url di ricerca basilare è: https://www.bing.com/search?q=testo+di+ricerca

Da notare che gli url indicati sono quelli “globali” ma si possono, ovviamente, anche usare le varianti nazionali, se/dove presenti (es. www.google.it). Inoltre ciascun motore di ricerca ha sicuramente una serie di possibili ulteriori parametri per gestire delle sue funzionalità aggiuntive.

Generalmente in questi casi il testo da ricercare si passa sempre in query string che è quella parte del url dopo il “?” che contiene le coppie nome=valore. Per via degli standard del web, la parte di query string va codificata appropriatamente (vedere Query string su Wikipedia per maggiori dettagli). Per far questo in Java è appropriato (e tipico) usare il metodo statico encode della classe java.net.URLEncoder.

Il seguente è un esempio basilare della ricerca con Google e Bing.

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;

public class ProvaRicercaInternet {
    public static void main(String[] args) {
        try {
            apriRicercaGoogle("foto di gatti");     // provare anche con apriRicercaBing
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    public static void apriRicercaGoogle(String testoRicerca) throws IOException, URISyntaxException {
        String valoreQ = URLEncoder.encode(testoRicerca, "UTF-8");
        URI uriRicerca = new URI("https://www.google.com/search?q=" + valoreQ);
        Desktop.getDesktop().browse(uriRicerca);
    }

    public static void apriRicercaBing(String testoRicerca) throws IOException, URISyntaxException {
        String valoreQ = URLEncoder.encode(testoRicerca, "UTF-8");
        URI uriRicerca = new URI("https://www.bing.com/search?q=" + valoreQ);
        Desktop.getDesktop().browse(uriRicerca);
    }
}

Il costruttore URI(String) si aspetta che la stringa ricevuta rappresenti un URI corretto secondo le specifiche (vedere la documentazione di java.net.URI per i dettagli). Se così non fosse, ad esempio se il testo di ricerca non fosse codificato in maniera appropriata, il costruttore di URI lancerebbe subito immediatamente un URISyntaxException.

Il codice riportato sopra è chiaramente basilare, scritto volutamente per essere breve e abbastanza comprensibile. In una applicazione più reale e concreta bisognerebbe sicuramente considerare meglio le eccezioni. I due metodi di ricerca possono infatti lanciare diverse eccezioni, tra cui in modo particolare le seguenti tre:

  • URISyntaxException se la stringa del URI non fosse composta correttamente secondo le specifiche. Ragionevolmente questo “non dovrebbe” avvenire nell’esempio sopra, perché è stato codificato il valore del parametro q e perché il resto del url è fisso ed è scritto perlomeno correttamente

  • UnsupportedOperationException se l’operazione di “browse” con Desktop non fosse supportata su un certo sistema (nota: questo si può anche testare a priori usando il metodo isSupported di Desktop passando come argomento Desktop.Action.BROWSE)

  • IOException se non esiste o non è stato possibile determinare il browser “predefinito” oppure se il lancio del browser è fallito per qualche motivo

Prima di concludere, è bene precisare che Google o Bing in futuro potrebbero cambiare la forma del loro url di ricerca. In tal caso il codice andrebbe ovviamente modificato di conseguenza.