Fetch

 L'API fetch fournit une interface Javascript pour accéder et manipuler les demandes et les réponses sur un réseau. Elle est fournie par la méthode globale window.fetch() du navigateur.

 

Dans un fichier index.html

  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4.     <meta charset="UTF-8">

  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">

  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">

  7.     <title>Document</title>

  8. </head>

  9. <body>

  10.     <h1>REpos contenant db</h1>

  11.     <ol id="repos"></ol>

  12.     <script src="./index.js"></script>

  13. </body>

  14. </html>

 

index.js

  1. async function getFromGitHub() {

  2.     try {

  3.         const userName = 'dupontdenis';

  4.         const url = 'https://api.github.com/users';

  5.      

  6.         const reposResponse = await fetch(`${url}/${userName}/repos`);

  7.  

  8.         const userRepos = await reposResponse.json();

  9.  

  10.         userRepos

  11.             .slice(0, 100)

  12.             .filter(({ name }) => /db/ig.test(name))

  13.             .sort((r1, r2) => {

  14.                 if (r1.name > r2.name) { return -1 } else return 1;

  15.             })

  16.             .forEach(({ name }) =>

  17.                 document

  18.                     .querySelector("#repos")

  19.                     .insertAdjacentHTML('afterbegin', `<li> ${name} </li>`))

  20.  

  21.     } catch (error) {

  22.         console.log(error);

  23.     }

  24. }

  25. getFromGitHub();

 

Connaissance des API

Github me permet de faire des recherches par page en triant les données.
Pour tester, ajoutons à l'adresse : ?per_page=100&sort=name&direction=desc

  1. async function getFromGitHub() {

  2.     try {

  3.         const userName = 'dupontdenis';

  4.         const url = 'https://api.github.com/users';

  5.         const reposResponse = await fetch(`${url}/${userName}/repos?per_page=100&sort=name&direction=desc`);

  6.  

  7.         const userRepos = await reposResponse.json();

  8.  

  9.         userRepos

  10.             .filter(({ name }) => /db/ig.test(name))

  11.             .forEach(({ name }) =>

  12.                 document

  13.                     .querySelector("#repos")

  14.                     .insertAdjacentHTML('afterbegin', `<li> ${name} </li>`))

  15.  

  16.     } catch (error) {

  17.         console.log(error);

  18.     }

  19. }

  20. getFromGitHub();

 

Passons du navigateur à une application en NodeJS

  1. const express = require('express');

  2. const { Octokit } = require("@octokit/core");

  3. const path = require('path');

  4. const debug = require('debug')('git');

  5. const app = express();

  6.  

  7. app.use(express.static(path.join(__dirname, 'public')));

  8. app.set('view engine', 'pug');

  9.  

  10. const octokit = new Octokit({});

  11.  

  12. app.get('/users/:id', async (req, res) => {

  13.  

  14.     try {

  15.         debug(`id = ${req.params.id}`);

  16.         const { data: user } = await octokit.request(`GET /users/{username}`, {

  17.             username: req.params.id,

  18.         });

  19.         debug(`data  = ${user.login}, ${user.avatar_url}`);

  20.  

  21.         res.render('index', { user });

  22.     } catch (error) {

  23.         console.log(error)

  24.     }

  25.  

  26. });

  27.  

  28. app.get('/users/:id/repos', async (req, res) => {

  29.  

  30.     try {

  31.         debug(`id = ${req.params.id}`);

  32.         debug(`sort = ${req.url}`);

  33.         const { data: repos } = await octokit.request(`GET ${req.url}`);

  34.         res.render('repos', { repos });

  35.     } catch (error) {

  36.         console.log(error)

  37.     }

  38.  

  39. });

  40. const port = process.env.PORT || 3000;

  41. app.listen(port, () => console.log(`Listening on port ${port}...`));

 

Lig: 33 ${req.url} contient l'ensemble de l'adresse par exemple :

/users/dupontdenis/repos?page2=&sort=name&direction=asc

La vue avec pug

  1. extends layout

  2.  

  3. mixin list-ord

  4.     ul 

  5.     each repo in repos

  6.         li= repo.name

  7.  

  8. block content

  9.     h1 repositories 

  10.     +list-ord

 

Testez les adresses : 

http://localhost:3000/users/dupontdenis/repos

http://localhost:3000/users/dupontdenis/repos?page2=&sort=name&direction=asc

 

git

Voir dans la branche amélioration

https://github.com/dupontdenis/useAPIgit.git