# # Kunden seitenweise aus einer REST-API lesen, mit Ländern aus einem zweiten Endpunkt anreichern, # nach CSV und JSON schreiben # # ruby examples/demo_api.rb & # Demo-API starten # bin/etl run examples/rest_lesen.rb [--url=http://127.0.0.1:4567] [--out=tmp] # require 'fileutils' require 'datapipeline' API = DataPipeline.params.fetch(:url, 'http://127.0.0.1:4567') AUTH = "Bearer #{ENV.fetch('DEMO_API_TOKEN', 'demo-token')}" out = DataPipeline.params.fetch(:out, 'tmp') FileUtils.mkdir_p(out) DataPipeline.new do version 'rest_lesen 1.0' # GET /api/kunden?page=1&per_page=3, dann page=2, ... bis eine Seite leer ist # die Zeilen stehen in der Antwort unter "data"; 429/5xx und Netzfehler werden bis zu 3-mal wiederholt kunden = container :rest, url: "#{API}/api/kunden", auth: AUTH, root: 'data', page_param: 'page', params: { 'per_page' => 3 }, retries: 3, retry_wait: 0.2 # derselbe Server, anderer Endpunkt: query hängt den Pfad an die url an (GET /api/laender) stamm = container :rest, url: "#{API}/api", auth: AUTH laender = lookup stamm, query: 'laender', key: 'code', unique: true read kunden on_error :collect, to: container(:csv, file: "#{out}/api_fehler.csv") validate 'id' => { required: true }, 'umsatz' => { type: :decimal } map do |kunde| { 'id' => kunde['id'], 'name' => kunde['name'], 'land' => laender.dig(kunde['land'], 'name') || kunde['land'], 'umsatz' => kunde['umsatz'].to_f } end write container(:csv, file: "#{out}/api_kunden.csv", columns: %w[id name land umsatz]) write container(:json, file: "#{out}/api_kunden.json", pretty: true) on_finish { |stats| puts "rest_lesen: #{stats}" } end.run