API IMDB in un programma Java

di il
13 risposte

API IMDB in un programma Java

Salve, nel fare un po' di pratica e nel contempo fare qualcosa di diverso, volevo fare un programma che chiede un film e restituisce l'anno, i vari attori e le altre informazioni relative al film.
Ho letto la documentazione e le api di IMDB ma non riesco proprio a capire come usarle in java... È possibile ? Come potrei fare senno, usando sempre Java come linguaggio principale?

grazie a tutti!

13 Risposte

  • Re: API IMDB in un programma Java

    fedez ha scritto:


    Ho letto la documentazione e le api di IMDB
    Puoi indicare esattamente cosa hai trovato?
  • Re: API IMDB in un programma Java

    Ecco:

    http://www.imdbapi.co
  • Re: API IMDB in un programma Java

    fedez ha scritto:


    Ecco:

    http://www.imdbapi.co
    Non la conosco ma da quello che vedo ... funziona facendo richieste HTTP, utilizza JSON o XML come formato dei dati. Ma NON è una API REST.

    Ad esempio un film che a me è piaciuto molto: http://www.omdbapi.com/?i=tt024089

    Per poterla usare in Java servono 3 cose:
    - poter fare richieste HTTP
    - poter parsare manualmente JSON/XML o poter fare il binding direttamente su una classe Java
    - definire le classi che "modellano" i risultati

    Le possibilità sono davvero tante: dall'uso diretto e più "becero" di URL/URLConnection con parsing manuale (o con binding) del JSON/XML usando direttamente librerie come Google GSON o la Jackson o per XML la API JAXB, fino all'uso di framework appositi che si occupano di gran parte di queste cose.
    Dipende anche molto dalle tue competenze.

    P.S. il risultato che vedo dall'esempio che ho fatto non mi pare molto "strutturato". I valori che vedo sono tutte stringhe (anche es. imdbVotes che è solo un numero) e ad esempio gli attori sono tutti in un'unica stringa.
  • Re: API IMDB in un programma Java

    Non conosco nessuna delle cose che hai detto purtroppo.
    Ma se mi dai qualche indicazione precisa, posso, e vorrei imparare.
    Come livello java, non sono molto avanzato... ho fatto metodi, incapsulamento, ereditarietà, polimorfismo, classi astratte, interfacce, GUI (Swing) e I/O.

    Quindi, per iniziare, anche la forma piu becera credo vada bene per inziate a capire i concetti base, perche per me sono completamente cose nuove. Cosa mi consigli?

    EDIT: ho trovato questo sito https://www.mashape.com/apathetic/imd, forse sono delle API Unofficial. Si trovano parecchi siti del genere in rete...
  • Re: API IMDB in un programma Java

    fedez ha scritto:


    Non conosco nessuna delle cose che hai detto purtroppo.
    Ma se mi dai qualche indicazione precisa, posso, e vorrei imparare.
    Ecco un esempio, buttato un po' giù velocemente ma che può esserti utile. Ho usato la libreria Jackson (con databinding). Se usi Maven, l'unica dependency da tirar dentro è:
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.1</version>
    </dependency>
    Non c'è nemmeno da usare "a mano" un (Http)URLConnection perché ho visto prima che il ObjectMapper di Jackson ha un readValue che accetta direttamente un URL.

    Il codice è semplice, solo 3 classi:
    public class MovieDemoMain {
        public static void main(String[] args) {
            OMDBClient omdbClient = new OMDBClient();
    
            try {
                Movie serendipity = omdbClient.getMovieByImdbID("tt0240890");
                System.out.println(serendipity);
    
                Movie armageddon = omdbClient.getMovieByImdbID("tt0120591");
                System.out.println(armageddon);
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    }
    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.io.IOException;
    import java.net.URL;
    
    public class OMDBClient {
        private ObjectMapper objectMapper;
    
        public OMDBClient() {
            objectMapper = new ObjectMapper();
        }
    
        public Movie getMovieByImdbID(String imdbId) throws IOException {
            String url = "http://www.omdbapi.com/?i=" + imdbId;
            return getFromUrl(url, Movie.class);
        }
    
        private <T> T getFromUrl(String urlString, Class<T> objClass) throws IOException {
            URL url = new URL(urlString);
            return objectMapper.readValue(url, objClass);
        }
    }
    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    import com.fasterxml.jackson.annotation.JsonProperty;
    
    // Questa JsonIgnoreProperties è solo perché non ho messo tutti i campi che modellano il movie
    @JsonIgnoreProperties(ignoreUnknown=true)
    public class Movie {
        @JsonProperty("Title")
        private String title;
    
        @JsonProperty("Year")
        private int year;
    
        @JsonProperty("Genre")
        private String genre;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public int getYear() {
            return year;
        }
    
        public void setYear(int year) {
            this.year = year;
        }
    
        public String getGenre() {
            return genre;
        }
    
        public void setGenre(String genre) {
            this.genre = genre;
        }
    
        public String toString() {
            return getTitle() + ", " + getYear() + "; " + getGenre();
        }
    }
  • Re: API IMDB in un programma Java

    Ciao, grazie per la risposta intanto.

    Prima cosa, hai detto se usi Maven... bene, no, non lo uso, uso Eclipse.
    E il codice ad esso relativo non capisco cosa sia... what's dependency?

    Per le altre 3 classi, ok ho capito a grandi linee cosa hai fatto.
    Il problema è che devo studiarmi cosa siano JSON e la serializzazione, che sono il fulcro per capire come funziona, e soprattutto per modificare e fare qualcosa di mio...

    Le tre classi corrispondono a

    Per poterla usare in Java servono 3 cose:
    - poter fare richieste HTTP
    - poter parsare manualmente JSON/XML o poter fare il binding direttamente su una classe Java

    Giusto?
  • Re: API IMDB in un programma Java

    fedez ha scritto:


    Prima cosa, hai detto se usi Maven... bene, no, non lo uso, uso Eclipse.
    Eclipse ha già integrato il supporto a Maven. Quindi spetta solo a te scegliere se creare un progetto "nativo" di Eclipse oppure un progetto basato su Maven (un "Maven Project").

    fedez ha scritto:


    what's dependency?
    Sono le dipendenze dichiarate in un progetto Maven. Scoprirai ben presto che se un tuo progetto richiede svariate librerie esterne, è più facile con Maven piuttosto che andarsi a cercare "a mano" i singoli jar sui vari siti delle librerie, valutare le versioni, capire le richieste di ciascuna libreria, ecc...

    fedez ha scritto:


    Il problema è che devo studiarmi cosa siano JSON e la serializzazione, che sono il fulcro per capire come funziona
    Per JSON, è sufficiente partire da https://it.wikipedia.org/wiki/JavaScript_Object_Notation

    "(de)serializzazione" in senso generale. Non è qui, in questo contesto, la serializzazione degli oggetti di Java.
  • Re: API IMDB in un programma Java

    andbin ha scritto:


    fedez ha scritto:


    Non conosco nessuna delle cose che hai detto purtroppo.
    Ma se mi dai qualche indicazione precisa, posso, e vorrei imparare.
    Ecco un esempio, buttato un po' giù velocemente ma che può esserti utile. Ho usato la libreria Jackson (con databinding). Se usi Maven, l'unica dependency da tirar dentro è:
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.1</version>
    </dependency>
    Non c'è nemmeno da usare "a mano" un (Http)URLConnection perché ho visto prima che il ObjectMapper di Jackson ha un readValue che accetta direttamente un URL.

    Il codice è semplice, solo 3 classi:
    public class MovieDemoMain {
        public static void main(String[] args) {
            OMDBClient omdbClient = new OMDBClient();
    
            try {
                Movie serendipity = omdbClient.getMovieByImdbID("tt0240890");
                System.out.println(serendipity);
    
                Movie armageddon = omdbClient.getMovieByImdbID("tt0120591");
                System.out.println(armageddon);
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    }
    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.io.IOException;
    import java.net.URL;
    
    public class OMDBClient {
        private ObjectMapper objectMapper;
    
        public OMDBClient() {
            objectMapper = new ObjectMapper();
        }
    
        public Movie getMovieByImdbID(String imdbId) throws IOException {
            String url = "http://www.omdbapi.com/?i=" + imdbId;
            return getFromUrl(url, Movie.class);
        }
    
        private <T> T getFromUrl(String urlString, Class<T> objClass) throws IOException {
            URL url = new URL(urlString);
            return objectMapper.readValue(url, objClass);
        }
    }
    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    import com.fasterxml.jackson.annotation.JsonProperty;
    
    // Questa JsonIgnoreProperties è solo perché non ho messo tutti i campi che modellano il movie
    @JsonIgnoreProperties(ignoreUnknown=true)
    public class Movie {
        @JsonProperty("Title")
        private String title;
    
        @JsonProperty("Year")
        private int year;
    
        @JsonProperty("Genre")
        private String genre;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public int getYear() {
            return year;
        }
    
        public void setYear(int year) {
            this.year = year;
        }
    
        public String getGenre() {
            return genre;
        }
    
        public void setGenre(String genre) {
            this.genre = genre;
        }
    
        public String toString() {
            return getTitle() + ", " + getYear() + "; " + getGenre();
        }
    }
    Ciao scusa per la risposta in ritardo, ho avuto parecchio da fare ultimamente.
    Mi sono messo a guardare il codice, ma con Eclipse, facendo un Java Project, dove fai gli import (delle librerie?) mi da errore.
    Dovrei importarla presumo, ma non trovo dove scaricare il jar, da importare.

    Ho provato anche a fare un Maven Project, ma ci sono parecchie cose che non conosco e quindi dovrei darci un occhio più approfondito, cosa che potrei fare domani.

    Grazie intanto
  • Re: API IMDB in un programma Java

    fedez ha scritto:


    facendo un Java Project, dove fai gli import (delle librerie?) mi da errore.
    Se è un normale Java Project, ci sono svariati modi. Non c'è infatti uno "standard". Vedi comunque innanzitutto "Java Build Path" nel Project Properties.

    Puoi:
    -tirar dentro un jar con un path assoluto sul file-system (progetto poco portabile su altre macchine),
    -definire in Eclipse una "User library" e poi facilmente referenziarla nei progetti (idem non proprio portabile)
    -creare una cartella "lib" nel progetto, metterci dentro i jar e poi referenziarli tramite path relativo al progetto (più portabile).

    fedez ha scritto:


    Dovrei importarla presumo, ma non trovo dove scaricare il jar, da importare.
    Servono 3 jar:
    jackson-core
    jackson-annotations
    jackson-databind

    Li trovi es. da qui: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/
    Prendi l'ultima attuale, 2.6.1
  • Re: API IMDB in un programma Java

    andbin ha scritto:


    fedez ha scritto:


    facendo un Java Project, dove fai gli import (delle librerie?) mi da errore.
    Se è un normale Java Project, ci sono svariati modi. Non c'è infatti uno "standard". Vedi comunque innanzitutto "Java Build Path" nel Project Properties.

    Puoi:
    -tirar dentro un jar con un path assoluto sul file-system (progetto poco portabile su altre macchine),
    -definire in Eclipse una "User library" e poi facilmente referenziarla nei progetti (idem non proprio portabile)
    -creare una cartella "lib" nel progetto, metterci dentro i jar e poi referenziarli tramite path relativo al progetto (più portabile).

    fedez ha scritto:


    Dovrei importarla presumo, ma non trovo dove scaricare il jar, da importare.
    Servono 3 jar:
    jackson-core
    jackson-annotations
    jackson-databind

    Li trovi es. da qui: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/
    Prendi l'ultima attuale, 2.6.1
    Ciao, ok sono riuscito. Ma volevo usare il "3 metodo" che mi sembra quello più elegante.
    Cosa intendi per "referenziali tramite path relativo al progetto"?
    Io in pratica ho creato una cartella, (cartella normale? o SourceFolder?) ci ho messo dentro i 3 jar, e poi non so che fare.

    Poi ho guardato per bene il codice e avrei alcune domande.
    Da quello che ho capito
    nella classe MovieDemoMain
    Movie serendipity = omdbClient.getMovieByImdbID(tastiera.next());
    Mi restituisce l'url completo e la classe Movie passandole al metodo successivo
    private <T> T getFromUrl(String urlString, Class<T> objClass) throws IOException {
            URL url = new URL(urlString);
            return objectMapper.readValue(url, objClass);
        }
    Cosa produce questa chiamata?
    objectMapper.readValue(url, objClass);
    Suppongo che setti tutti i campi della classe Movie, per poi restituirla "personalizzata" e dalla Classe Main, la stampi tramite il metodo toString..

    Ma questo può essere a grandi linee... cioè, quello che intendo, come fa a grabbare tutti i campi?
  • Re: API IMDB in un programma Java

    fedez ha scritto:


    Ma volevo usare il "3 metodo" che mi sembra quello più elegante.
    Cosa intendi per "referenziali tramite path relativo al progetto"?
    Io in pratica ho creato una cartella, (cartella normale? o SourceFolder?) ci ho messo dentro i 3 jar, e poi non so che fare.
    "Source" folder no, è per i sorgenti, non per i jar. Una normale cartella es. "lib" allo stesso livello di src.
    Poi Project Properties -> Java Build Path -> tab Libraries -> pulsante Add JARs quindi seleziona il jar nella lib.
    Se poi andassi a vedere il file .classpath del progetto di Eclipse, vedresti un

    <classpathentry kind="lib" path="lib/nome.jar"/>

    che è quindi un path "relativo" al progetto e pertanto più portabile (se zippi la cartella del progetto e lo dai ad un amico, non avrà problemi riguardo la libreria).

    fedez ha scritto:


    Cosa produce questa chiamata?
    objectMapper.readValue(url, objClass);
    I framework di "binding" tra classi Java e documenti XML, JSON ecc... si basano sulla "reflection".
    L'oggetto nel JSON ha una proprietà "Title" e in Movie c'è un field title che non corrisponde perfettamente ma con la annotazione @JsonProperty c'è il nome "Title" esatto.
    Jackson ispeziona tramite reflection la classe, ne istanzia un oggetto e poi assegna i valori che corrispondono a proprietà o campi dell'oggetto (basandosi anche sulle annotazioni di Jackson) dai dati nel JSON.
  • Re: API IMDB in un programma Java

    andbin ha scritto:


    fedez ha scritto:


    Ma volevo usare il "3 metodo" che mi sembra quello più elegante.
    Cosa intendi per "referenziali tramite path relativo al progetto"?
    Io in pratica ho creato una cartella, (cartella normale? o SourceFolder?) ci ho messo dentro i 3 jar, e poi non so che fare.
    "Source" folder no, è per i sorgenti, non per i jar. Una normale cartella es. "lib" allo stesso livello di src.
    Poi Project Properties -> Java Build Path -> tab Libraries -> pulsante Add JARs quindi seleziona il jar nella lib.
    Se poi andassi a vedere il file .classpath del progetto di Eclipse, vedresti un

    <classpathentry kind="lib" path="lib/nome.jar"/>

    che è quindi un path "relativo" al progetto e pertanto più portabile (se zippi la cartella del progetto e lo dai ad un amico, non avrà problemi riguardo la libreria).

    fedez ha scritto:


    Cosa produce questa chiamata?
    objectMapper.readValue(url, objClass);
    I framework di "binding" tra classi Java e documenti XML, JSON ecc... si basano sulla "reflection".
    L'oggetto nel JSON ha una proprietà "Title" e in Movie c'è un field title che non corrisponde perfettamente ma con la annotazione @JsonProperty c'è il nome "Title" esatto.
    Jackson ispeziona tramite reflection la classe, ne istanzia un oggetto e poi assegna i valori che corrispondono a proprietà o campi dell'oggetto (basandosi anche sulle annotazioni di Jackson) dai dati nel JSON.
    dici che dare un occhiata a
    http://fasterxml.github.io/jackson-databind/javadoc/2.5/index.html
    può essere utile per capirne un po' di più?

    Io ho finito il primo anno di Informatica, corso di Java, passato con 28 ma di queste cose, "reflection", JSON e API non ne abbiamo mai accennato. Sinceramente pensavo di avere una conoscenza più ampia di Java dopo il corso. Mi sono dovuto studiare da solo pure la GUI Swing per creare qualcosa di decente, per avere un interfaccia grafica almeno.

    EDIT: ho appena trovato un pdf (a prima vista fantastico) che parla dei seguenti argomenti:
    Nota, dedica soltanto 50 pagine per tutti gli argomenti che ho affrontato io nel corso
    1) Multi-threading in Java
    2) Networking
    3) Remote Method Invocation
    4) Java Beans
    5) Swing
    6) Applet
    7) Internazionalizzazione delle applicazioni
    Java e XML
    9) Servlet API
    10) Java Server Pages
    11) Java e CORBA
    12) Enterprise Java Beans
    13) Gestione della sicurezza
  • Re: API IMDB in un programma Java

    fedez ha scritto:


    dici che dare un occhiata a
    http://fasterxml.github.io/jackson-databind/javadoc/2.5/index.html
    può essere utile per capirne un po' di più?
    Sì certo, è sicuramente utile per capire qualcosa su Jackson. Potresti innanzitutto vedere la documentazione della classe ObjectMapper.

    fedez ha scritto:


    Nota, dedica soltanto 50 pagine per tutti gli argomenti che ho affrontato io nel corso
    Se vuoi una documentazione più "corposa" su ciascun argomento, ci sono libri appositi specifici per molti degli argomenti che hai citato.
Devi accedere o registrarti per scrivere nel forum
13 risposte