Comment appeler l'API REC Registery et stocker les JSON retournés dans une sorte de base de données

J'aimerais rompre cela avec des questions plus petites et plus serrées, mais je ne sais pas ce que je ne connais pas assez pour le faire encore. Donc, espérons, on peut obtenir des réponses précises pour aider à faire cela.

La portée de la solution nécessite de recevoir et d'analyser beaucoup d'enregistrements, 2013 ont eu des transactions de certificats de ~ 17 millions alors que je ne suis intéressé que par de très petits sous-ensembles d'ordres 40 000 enregistrements.

En pseudo-code:

  • Itérer les dates (thisDate)
    • Envoyer un message à l'API pour cette date
    • Recevez JSONS en tant que cadres d'aujourd'hui
    • Examinez les règles d'aujourd'hui pour rechercher tout critère correspondant à la structure
    • Ajoute un sous-ensemble de l'ordre d'aujourd'hui à RecordsOut
  • Enregistrer les enregistrementsSuivre un fichier SQL / CSV.

Il existe une grande base de données sur les certificats d'énergie renouvelable pour l'utilisation dans le cadre du système de RET du gouvernement australien appelée REC Registery et ainsi que l'interface Web liée ici , il existe une API qui dispose d'une logique d'appel simple comme suit

http://rec-registry.gov.au/rec-registry/app/api/public-register/certificate-actions?date=<user provided date> où:

  • La date dans laquelle l'URL doit être fournie par l'utilisateur
  • Le format de la date doit être AAAA-MM-JJ (pas de crochets et 1 limite de date)

Un JSON est retourné (avec potentiellement 100 000 d'enregistrements chaque jour).

La documentation de l'API (13pp PDF) est ici , mais elle consiste principalement à expliquer les éléments de la structure renvoyée qui sont moins pertinents pour ma question. Comprend deux exemples de réponses JSON.

Bien que je connaisse un peu de Javascript (principalement pas dans un contexte Web), je ne suis pas sûr de comment envoyer ce message dans un script et j'aurais besoin de le faire côté du serveur pour pouvoir traiter (filtrer) les informations renvoyées et puis enregistrer Les enregistrements qui m'intéressent. Je n'aurai aucun problème en analysant le JSON (si je peux utiliser JS) et en copiant les objets que je souhaite sauvegarder, je ne suis pas sûr d'où commencer. Ai-je besoin d'une configuration LAMP pour le faire (ou MAMP depuis que je suis sur OS X) ou existe-t-il un mode JS plus léger que je peux exécuter cela. Je n'ai jamais su enregistrer des fichiers à partir du navigateur Web JS, je pensais qu'il avait été interdit pour des raisons de sécurité, mais je pense qu'il y a des moyens.

Si je peux réécrire cette question pour être plus clair et plus efficace pour solliciter une réponse, je suis heureux que les modifications soient également posées.

Je suppose que je suis après un certain code d'appel pour appeler une API simple comme celle-ci et le contexte de la pile ou de l'application dans laquelle je dois le faire. Je me rend compte qu'il existe plusieurs façons possibles d'exécuter cela, mais je recherche le plus simple pour quelqu'un avec une connaissance de JS et pas beaucoup d'expérience PHP / Python (mais disposé à apprendre ce qu'il faut).

Facile à faire?

Ok, pour vous indiquer dans la bonne direction.

Exigences

Si la langue de choix est Javascript, vous devez installer Node.js. Aucun serveur n'a été nécessaire.

Idem est valable pour PHP ou Python ou quoi que ce soit. Aucun apache n'est nécessaire, juste le lang int.

Exécution d'un script avec nœud

Créez un file.js quelque part. Pour l'exécuter, il vous suffit de taper (dans la console) node file.js (dans le répertoire dans node file.js le fichier).

Obtenir l'accès depuis le service Web REC

Voici un exemple de demande GET:

 var https = require('https'); var fs = require('fs'); var options = { host: 'rec-registry.gov.au', port: 443, path: '/rec-registry/app/api/public-register/certificate-actions?date=2015-06-03' }; var jsonstr = ''; var request = https.get(options, function(response) { process.stdout.write("downloading data..."); response.on('data', function (chunk) { process.stdout.write("."); jsonstr += chunk; }); response.on('end', function () { process.stdout.write("DONE!"); console.log(' '); console.log('Writing to file...'); fs.writeFile("data.json", jsonstr, function(err) { if(err) { return console.error('Error saving file'); } console.log('The file was saved!'); }); }); }) request.on('error', function(e) { console.log('Error downloading file: ' + e.message); }); 

Transformer une chaîne json en objet / tableau

Utiliser JSON.parse

Analyse des données

Examinez les règles d'aujourd'hui pour rechercher tout critère correspondant à la structure

Ne peut pas vous aider là-bas, mais devrait être relativement simple de rechercher les propriétés correctes de l'objet.

REMARQUE: En gros, ce que vous obtenez de la requête est une chaîne. Vous analysez ensuite cette chaîne avec

 var foo = JSON.parse(jsonstr) 

Dans ce cas, foo est un objet. Les résultats «certificats» sont effectivement dans le result la propriété, qui est un tableau

 var results = foo.result; 

Dans cet exemple, le tableau contient environ 1700 enregistrements et la structure d'un certificat ressemble à ceci:

 "actionType": "STC created", "completedTime": "2015-06-02T21:51:26.955Z", "certificateRanges": [{ "certificateType": "STC", "registeredPersonNumber": 10894, "accreditationCode": "PVD2259359", "generationYear": 2015, "generationState": "QLD", "startSerialNumber": 1, "endSerialNumber": 72, "fuelSource": "SGU - solar (deemed)", "ownerAccount": "Solargain PV Pty Ltd", "ownerAccountId": 25782, "status": "Pending audit" }] 

Ainsi, pour accéder, par exemple, au «compte propriétaire» du premier «certificatRangements» du premier «certificat» que vous feriez:

 var results = JSON.parse(jsonstr).result; var ownerAccount = results[0].certificateRanges[0].ownerAccount; 

Création d'un csv

La meilleure façon est de créer une structure abstraite (qui répond à vos besoins) et de la convertir en csv.

Il y a une bonne bibliothèque npm appelée json2csv qui peut vous aider là-bas

Exemple:

 var fs = require('fs'); var json2csv = require('json2csv'); var fields = ['car', 'price', 'color']; // csv titles var myCars = [ { "car": "Audi", "price": 40000, "color": "blue" }, { "car": "BMW", "price": 35000, "color": "black" }, { "car": "Porsche", "price": 60000, "color": "green" } ]; json2csv({ data: myCars, fields: fields }, function(err, csv) { if (err) console.log(err); fs.writeFile('file.csv', csv, function(err) { if (err) throw err; console.log('file saved'); }); }); 

Si vous souhaitez ajouter au lieu d'écrire sur un nouveau fichier, vous pouvez utiliser

 fs.appendFile('file.csv', csv, function (err) { });