Résolu savoir si un jour est férié grâce à l'api du gouvernement

Plus d'informations
il y a 1 mois 1 semaine #33517 par gertrude
Bonjour chers powershellers, revoici gertude ;)

Aujourd'hui je souhaite savoir si une date est un jour férié ou non.
Je me suis donc rendue sur l'api de notre gouvernement : api , documentation

Sauf que c'est la première fois que je veux manipuler une api, et que je manipule un fichier au format json ! Du coup, c'est pas facile de comprendre ce que je fais...

Voici mon code qui n'est pas fonctionnel :

# définir l'URL de l'API
$url = "calendrier.api.gouv.fr/jours-feries/metropole.json"

# entrer la date à vérifier (au format AAAA-MM-JJ)
$date = "2024-05-01"

# effectuer une requête GET à l'API
$response = Invoke-RestMethod -Uri "$url$date" -Method Get

# vérifier si le jour est férié
if ($response.isHoliday) {
    Write-Output "Le $date est un jour férié en France."
} else {
    Write-Output "Le $date n'est pas un jour férié en France."
}



j'ai cette erreur en console :

Au caractère Ligne:8 : 13
+ $response = Invoke-RestMethod -Uri "$url$date" -Method Get
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand


Avez-vous des idées ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 semaine - il y a 1 mois 1 semaine #33519 par Arnaud Petitjean
Bonjour chère Gertrude, tu viens avec un super cas d'usage aujourd'hui. C'est cool ! 

Tu me fais découvrir les API du Gouvernement, que je ne connaissais pas. Et ça c'est chouette  .

Tout d'abord, il faut savoir que lorsque tu "consommes" (c'est le terme) une API REST, tu vas récupérer en retour soit du XML, soit du JSON. Les API récentes retournent en général du JSON car moins verbeux que le XML. 
Toujours est-il que PowerShell sait gérer les 2, grâce aux commandes ConvertFrom-XML et ConvertFrom-Json.

Donc, dans ton cas il va falloir convertir le fichier JSON que tu récupères via l'API en objets PowerShell. Et ensuite nous pourrons les manipuler et faire la comparaison avec ta date.

L'idéal ici sera d'utiliser PowerShell 7 car dans cette version la commande ConvertFrom-Json a été améliorée et possède le paramètre -AsHashTable. Ce dernier sera très utilise, comme son nom l'indique afin de convertir le résultat sous forme de HashTable ou de tableau associatif en français .
Donc, on pourrait écrire le bout de code suivant :

$url = 'https://calendrier.api.gouv.fr/jours-feries/metropole.json'
$HashJoursFeries = (Invoke-WebRequest -Uri $url).content | ConvertFrom-Json -AsHashtable

# Date à vérifier (au format AAAA-MM-JJ)
$date = '2024-05-01'

if ($HashJoursFeries.keys -contains $date) {
    Write-Output "La $date est un jour férié en France."
} else {
    Write-Output "La $date n'est pas un jour férié en France."
}


Voilà, après l'idéal serait que tu en fasses une fonction où tu passerais une date et elle te retournerait $true ou $false en fonction qu'elle est fériée ou non  .

Tu noteras au passage que j'ai préféré la commande Invoke-WebRequest à la commande Invoke-RestMethod car je voulais convertir moi-même le fichier Json pour avoir plus de contrôle.  Invoke--RestMethod fait la conversion automatiquement mais pas en tant que HashTable. Cela dit, j'ai pas trop cherché. Il doit aussi y avoir un moyen d'y arriver avec Invoke-RestMethod.

Arnaud

MVP (Reconnect) et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Dernière édition: il y a 1 mois 1 semaine par Arnaud Petitjean.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 semaine #33529 par gertrude
Bonjour Arnaud et merci pour ta réponse complète

C'est un plaisir de faire découvrir de nouvelles choses à la communauté ! Il y a des tas d'api gouvernementales !
Il y a un an, j'en avais utilisé une pour faire un jeu comme le juste prix : on rentrait le code postal d'une commune, s'il y en avait plusieurs on choisissait laquelle, puis on avait un certain nombre d'essais pour trouver le bon nombre d'habitants. J'avais fait ça en python, mais en powershell ce doit être tout autant possible.

Je relirai à tête reposée le reste de ton message, car je n'ai pas bien compris la notion de Hashtable : j'ai l'impression que ce sont les fameux tableaux dont je parle dans mes scripts.

Le code que tu proposes ne fonctionne pas sur windows powershell (5)
J'ai donc installé powershell 7, aussi appelé powershell core.
J'ai appris qu'il va remplacer windows powershell, aussi appelé powershell 5.

Le seul point négatif, c'est que je dois arrêter d'utiliser powershell ise : il a fallu que j'installe vscode. Ca contrarie le début d'habitudes que j'avais créées, mais apparemment il ne semble pas y avoir d'autre solution. J'espère que les autres scripts que j'ai écrits sont compatibles avec cette nouvelle version 7 !

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 6 jours #33533 par ericlm128
Une solution simple en PowerShell 5, l'installation de PowerShell 7 pour ceci me parait un peu démesuré
$url = 'https://calendrier.api.gouv.fr/jours-feries/metropole.json'
$JoursFeries = Invoke-RestMethod -Uri $url

$date = '2024-05-01'

if ($JoursFeries.$date)
{
    Write-Output "Jour férié :)"
}
else
{
    Write-Output "On travail :("
}

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 5 jours #33534 par Arnaud Petitjean
Bonjour Eric,

Pas mal cette solution en effet  .

Comme quoi, il y a toujours plein de façons différentes de traiter une problématique.

Arnaud

MVP (Reconnect) et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 5 jours #33535 par Arnaud Petitjean
Salut Gertrude,

Effectivement PowerShell 7 va remplacer à terme Windows PowerShell (comprendre les versions de PS 5.1 et antérieures). Microsoft ne fera plus évoluer PS 5.1.

Il est donc préférable de petit à petit passer à PowerShell 7. Même si la version 5.1 aura la peau dure car elle est encore nativement installée sur les serveurs Windows Server 2022; et donc sera supportée jusqu'en 2032 ! ;-)

Et oui, Visual Studio Code est lui aussi l'avenir. Il remplace PowerShell ISE, qui lui non plus n'évoluera plus. Il faut donc faire la bascule dès maintenant, c'est préférable.

Arnaud

MVP (Reconnect) et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.077 secondes
Propulsé par Kunena