Récupérer la réponse d'une API en JSON

Fermé
Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020 - Modifié le 17 oct. 2019 à 20:29
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 31 oct. 2019 à 21:09
Bonjour à tous,

Je dois développer une application qui extrait des donnée d'une autre application (TeamWork) via une de leur API. Je voudrai récupérer la réponse de l'API (qui est en JSON), et la traité dans mon application java, en filtrant pour récupérer seulement les infos qui m'intéresse. Pour cela j'hésite entre 2 solutions : soit utiliser Regex (API java) soit ETL. Je ne sais pas trop qu'elle est leur différence, et comment je dois m'en servir. Des idées ?

Merci

4 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
16 oct. 2019 à 18:17
Bonjour,

Ça n'a aucun intérêt de repartir d'aussi bas niveau qu'une regex.
Tu devrais directement utiliser les standards de Java EE.

Par exemple : https://cxf.apache.org/docs/jax-rs-client-api.html
1
Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020
17 oct. 2019 à 10:06
Bonjour, merci de ta réponse, mais je ne m'y connais pas trop, et ce que je trouve sur internet me semble confus... Peux tu m'expliquer rapidement ce que c'est ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
17 oct. 2019 à 12:59
Salut Kilkenny95,

Je ne peux pas répondre pour t'éclairer sur la suggestion de KX, car je ne fais du Java que très occasionnellement.

mais... dans ton cas, est-ce qu'une simple bibliothèque permettant de parser le JSON que tu récupères ne serait pas suffisante ?

Il en existe de nombreuses : https://github.com/fabienrenaud/java-json-benchmark

Celle-ci https://github.com/stleary/JSON-java par exemple (qui n'est pas la meilleure ni la plus optimisée selon le comparatif ci-dessus) est assez simple d'utilisation pour des besoins simples : http://theoryapp.com/parse-json-in-java/

Exemple tiré de ce lien :

String str = "{ \"name\": \"Alice\", \"age\": 20 }";
JSONObject obj = new JSONObject(str);
String n = obj.getString("name");
int a = obj.getInt("age");
System.out.println(n + " " + a);  // prints "Alice 20"


Tu as un topic SO sur la question : https://stackoverflow.com/questions/2591098/how-to-parse-json-in-java

Dal
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 17 oct. 2019 à 16:03
Bonjour,

Voici un exemple de service REST https://jsonplaceholder.typicode.com/users qui liste des utilisateurs.

Avec CXF pour la partie JAX-RS et Jackson pour la partie JSON, je peux écrire ce code :
import java.util.List;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@JsonIgnoreProperties(ignoreUnknown=true)
class User {
    @JsonProperty("name")
    public String name;
    
    @JsonProperty("address")
    public Address address;
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Address {
    @JsonProperty("city")
    public String city;
}

public class Application {
    public static void main(String[] args) {
        Response response = ClientBuilder.newClient().register(JacksonJsonProvider.class)
                .target("https://jsonplaceholder.typicode.com/").path("users")
                .request().get();

        List<User> users = response.readEntity(new GenericType<List<User>>() {});
        for (User user : users) {
            System.out.println(user.name + " : " + user.address.city);
        }
    }
}

Remarque : il faut bien sûr ajouter les dépendances sur CXF et Jackson, par exemple avec Maven :
<dependencies>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.15</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>
1
Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020
17 oct. 2019 à 16:07
merci, mais je ne vois pas du tout ce qu'est une dependances CXF ou Jackson.
De plus, je n'arrive pas à générer mes classes java avec mon JSON avec jsonschema2pojo....
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020
17 oct. 2019 à 17:19
Une dépendance, c'est un morceau de code fourni par quelqu'un d'autre, il faut ajouter les jars correspondants sinon tu ne pourra pas compiler ou exécuter ton code.
Les imports javax.ws.rs.* dépendent de CXF, et les imports com.fasterxml.jackson de Jackson.

Si tu arrives à faire fonctionner mon exemple, ce sera déjà un bon début...

Quant à jsonschema2pojo, c'est un outil parmi d'autres sur internet, qui permet de générer automatiquement du code à partir d'un extrait de JSON ou d'un contrat YAML (l'idéal).
Voici comment j'aurais pu le configurer pour mon exemple, mais tu pourrais très bien coder tes POJO à la main.
0
Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020
23 oct. 2019 à 10:49
Merci beaucoup, je vais tester ça.

J'ai une autre question où tu pourrais peut-être m'aider : j'ai surement besoin d'une base de données pour stocker mes donnée recupérer par mon appli web, puis-utiliser une base Access ? ai-je besoin d'un autre outils pour faire communiquer cette base à mon appli (ormis un JDBC)

Merci à toi
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 oct. 2019 à 12:10
Théoriquement oui, tu pourrais utiliser une base Access, mais ce n'est pas la plus simple à intégrer à Java.
Si tu as le choix du JDBC je te conseille PostgreSQL. Mais à part le driver JDBC il n'y a rien besoin de plus.
0
Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020
23 oct. 2019 à 12:57
J'avais lu qu'en utilisant Tomcat, étant un serveur d’application, il pouvait stocker des données. Et encore une fois, puis-je mettre tomcat sur un serveur ? (le serveur de mon service au boulot). Car je le répète, j'essaye de developper une application web.

Merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 oct. 2019 à 13:23
Le plus simple serait d'utiliser Spring Boot, ce serait "juste un jar" qu'il faudrait démarrer via une commande java sur ton serveur, donc sans installer Tomcat.
Une application Spring Boot contient son propre serveur et démarre ton service directement.

Par contre il faudrait quand même installer une base de données à part, à moins que tes besoins en données soient limités, auquel cas tu pourrais utiliser une base de données embarquée (Derby par exemple), c'est à dire que quand tu lances le jar, il démarrer la base de donnée et le serveur en même temps.

Tout en un, c'est pratique (mais ça a aussi ces limites)
0
Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020
23 oct. 2019 à 13:26
Quand tu parles de services, tu parles de mon appli web ...?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Kilkenny95 Messages postés 157 Date d'inscription lundi 24 septembre 2018 Statut Membre Dernière intervention 31 août 2020
23 oct. 2019 à 13:27
Oui.
0