Get the list of products available from endpoint including the product id and version.
constaxios=require('axios');constapiKey='Insert API key here';asyncfunctiongetList() {constdataPackageList=awaitaxios({ url:'https://api.os.uk/downloads/v1/dataPackages', headers: { key: apiKey } });/* For explanation and debugging purposes we display the full response from the API in the console */console.log(dataPackageList.data);for (constdataPackageofdataPackageList.data) {/* This will print out the url of the data package id which can be used in another request. This would be the ideal place to call another function which continues the processing or filters down the results to the set required. */console.log(dataPackage.url); }}getList();
This is similar to a manual download in that you first need to discover what is available. Be mindful that list items can change.
Each entry in the JSON response provides data package metadata, as well as information about available versions of the data package.
You may at this point wish to create a loop that iterates through all available data packages or a subset that you are interested in based on common attributes (for example, vector data in a certain format).
You could store the data package id and version ids. That way you can easily check periodically for new versions of the data package being available, simply by comparing the versions we provide with the ones that you hold.
2
Get product specific information
While the key parts of this are already provided in step 1, this shows another way of getting to specific detail.
constaxios=require('axios');/* This function will return information about a specific data package. You will need to insert both a dataPackageId and API key to complete the implementation. */constapiKey='Insert API key here';constdataPackageId='Insert data package id here';asyncfunctiongetDataPackageDetails() {constdataPackageDetails=awaitaxios({ url:'https://api.os.uk/downloads/v1/dataPackages/'+ dataPackageId, headers: { key: apiKey } });console.log(dataPackageDetails.data);/* At this point we could insert another function to process the results or act on them/download them */}getDataPackageDetails();
3
Download data
Using the product id from the previous response make a call to the endpoint. Once you obtain the download links for the data package version you are ready to download the data.
By including latest as the versionId this will return information about the most recent data package version, including a list of the files that are available to download.
In this example we hard code the data package id that we are interested in. This can also be provided dynamically into the function allowing the same function to be used for multiple products and formats.
constfs=require('fs');constaxios=require('axios');constapiKey='Insert API key here';constdataPackageId='Insert data package id here';/* ============================================================Function: Uses Axios to download file as stream using Promise============================================================ */constdownload_file= (url, fileName) =>axios({ url, headers: { key: apiKey }, responseType:'stream' }).then( response =>newPromise((resolve, reject) => {response.data.pipe(fs.createWriteStream(fileName)).on('finish', () =>resolve()).on('error', e =>reject(e)); } ));/* ============================================================Download all of the files in the latest data package version============================================================ */asyncfunctiondownloadFiles() {try {constdownloadInfo=awaitaxios({ url:'https://api.os.uk/downloads/v1/dataPackages/'+ dataPackageId +'/versions/latest', headers: { key: apiKey } });for (constdownloadofdownloadInfo.data.downloads) {let downloadFile =awaitdownload_file(download.url,download.fileName);console.log(`Downloaded file ${download.fileName}`); }console.log('Completed downloading files'); } catch (error) {console.error(error); }}downloadFiles();