如何调用 REC Registery API 并将返回的 JSON 存储到某种数据库中

How to call REC Registery API and store returned JSONs into some kind of database

我想将其分解为更小、更严密的问题,但我不知道我还不够了解什么来做到这一点。所以希望能得到具体的答案来帮助做到这一点。

解决方案的范围需要接收和解析大量记录,2013 年有约 1700 万个证书交易,而我只对非常小的部分感兴趣订单 40,000 条记录。

在伪代码中:

Australian Government RET Scheme called the REC Registery and as well as the web interface linked to here下有一个大型的可再生能源证书数据库可供使用,API 提供了一个简单的调用逻辑如下

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

返回 JSON(每天可能有 100,000 条记录)。

API 文档 (13pp PDF) 是 here,但它主要解释与我的问题不太相关的返回结构的元素。包括两个示例 JSON 响应。

虽然我知道一些 Javascript(主要不是在网络上下文中),但我不确定如何在脚本中发送此消息,并且我认为我需要在服务器端执行此操作才能处理(过滤)返回的信息,然后保存我感兴趣的记录。我可以毫无问题地解析 JSON(如果我可以使用 JS)并复制我希望保存的对象 我不确定从哪里开始这样做。我是否需要 LAMP 设置来执行此操作(或 MAMP,因为我在 OS X 上)或者是否有更轻量级的 JS 方式我可以执行此操作。我从来不知道如何从网络浏览器 JS 中保存文件,我认为它出于安全原因被禁止,但我想有办法。

如果我可以重写这个问题,使其更清楚、更有效地征求答案,我也很乐意编辑问题。

我想我可能正在寻找一些样板代码来调用像这样的简单 API 以及我需要在其中执行此操作的堆栈或应用程序上下文。我意识到有几种潜在的方法可以执行此操作,但寻找具有 JS 知识且 PHP/Python 经验不多(但愿意学习它需要什么)的人最直接。

简单吧?

好的,为您指明正确的方向。

要求

如果选择的语言是 Javascript,您将需要安装 Node.js。不需要任何服务器。

同样适用于 PHP 或 Python 或其他。不需要 apache,只需要 lang int。

运行 带有节点的脚本

在某处创建一个file.js。要 运行 它,您只需(在控制台中)键入 node file.js(在文件所在的目录中。

从 REC Web 服务获取信息

这是一个 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);
});

将 json 字符串转换为 object/array

使用JSON.parse

正在解析数据

examine todaysRecords to look for whatever criteria match inside the structure

无法在这方面帮助您,但查找正确的对象属性应该相对简单。

注意:基本上,您从请求中得到的是一个字符串。然后,您使用

解析该字符串
var foo = JSON.parse(jsonstr)

在这种情况下 foo 是一个对象。结果"certificates"其实是在属性里面result,这是一个数组

var results = foo.result;

在此示例中,数组包含大约 1700 条记录,证书的结构如下所示:

"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": "S.G.U. - solar (deemed)",
  "ownerAccount": "Solargain PV Pty Ltd",
  "ownerAccountId": 25782,
  "status": "Pending audit"
}]

因此,例如,要访问第一个 "certificate" 的第一个 "certificateRanges" 的 "ownerAccount",您可以这样做:

var results = JSON.parse(jsonstr).result;

var ownerAccount = results[0].certificateRanges[0].ownerAccount;

正在创建一个 csv

最好的方法是创建一个抽象结构(满足您的需要)并将其转换为 csv。

有一个很好的 npm 库 json2csv 可以帮助你

示例:

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');
  });
});

如果您希望追加而不是写入新文件,您可以使用

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