Brug Groovy til at få adgang til og analysere en valutakurs API

En groovy måde at forenkle bogføringen på: en trinvis vejledning til konvertering af valutaveksling ved hjælp af Apache Groovy.

Brug Groovy til at få adgang til og analysere en valutakurs API

Få nyhedsbrevet

Deltag i 85,000 open source advokater, der modtager vores giveaway alarmer og artikel roundups.

Jeg bor i Canada og laver en hel del arbejde i andre lande, så når jeg udfører bogføringen, er jeg nødt til at konvertere indtægter og udgifter i fremmed valuta til canadiske dollars. Jeg plejede at gøre dette ved hårdt at søge historiske valutakurser på Bank of Canada, men sidste år reducerede banken antallet af valutaer, den understøtter. Jeg besluttede at kigge efter en anden og mere praktisk løsning ved hjælp af et websted, der offentliggør historiske data om valutakurser og Apache Groovy, et programmeringssprog til Java-platformen.

Jeg fandt to valutahistoriske sider, der tillader en vis grad af fri adgang i form af opkald til deres API'er, der returnerer resultater i JSON, så jeg skrev et lille script i Groovy for at analysere JSON og give mig tilbage de oplysninger, jeg har brug for at angive i mit bogføringsprogram. Sådan gjorde jeg det.

Valutakurswebsteder og deres API'er

Det første sted, jeg fandt, er Fixer.io, som jeg virkelig kan lide. Det er en gratis tjeneste, der får adgang til data fra Europæiske Centralbank. API'et er ligetil og let at bruge. Hvis jeg f.eks. Vil have valutakurser for canadiske dollars og indiske rupier, bruger jeg følgende URL:

https://api.fixer.io/latest?symbols=CAD,INR

som da jeg kørte denne forespørgsel til denne artikel, returnerede følgende JSON:

{
"base":"EUR",
"date":"2018-02-15",
"rates":{"CAD":1.5604,"INR":79.849}
}

Dette viser, at det den februar. 15, 2018, tog det 1.5604 canadiske dollars at købe 1 euro, og det tog 79.849 indiske rupier at købe 1 euro. For at finde ud af, hvor mange indiske rupier det tog at købe 1 canadisk dollar, skal du bare dele 79.849 med 1.5604 for at nå frem til 51.172 indiske rupier per canadisk dollar. Hvad kunne være lettere?

Endnu bedre er Fixer.io open source, der er offentliggjort under MIT-licensen, og koden er tilgængelig på GitHub.

Fixer.io adresserede mit behov for at konvertere indiske rupier til canadiske dollars, men desværre tilbyder det ikke en løsning for chilenske pesos, da basisdataene i Den Europæiske Centralbank dækker “kun” 32-valutaer.

For at få information om chilenske pesos, endte jeg kl Currencylayer, som (på dette tidspunkt) leverer data for 168-valutaer. Currencylayer kræver registrering og opkræver et gebyr for sine mere værdifulde produkter og komplekse operationer, men grundlæggende historisk valutakursomregning mellem amerikanske dollars og 167 andre valutaer er gratis. På grund af dens brede dækning brugte jeg Currencylayer til at skrive denne artikel.

Registrering hos Currencylayer giver brugeren en nøgle, der giver adgang til den valgte række af tjenester. Antager, at nøglen er K, derefter en URL som:

http://apilayer.net/api/historical?access_key=K&date=2018-01-01&currencies=CAD,EUR&format=1

returnerer følgende JSON:

{
"success":true,
"terms":"https://currencylayer.com/terms",
"privacy":"https://currencylayer.com/privacy",
"historical":true,
"date":"2018-01-01",
"timestamp":1514851199,
"source":"USD",
"quotes":{
"USDCAD":1.25551,
"USDEUR":0.832296
}
}

Brug af Groovy til at få adgang til API'en og analysere JSON-resultaterne

Groovy leverer nogle kortfattede værktøjer til håndtering af URL'er, datastrømme og JSON.

Fra JSON-slutningen er der JSON slurper og det er praktisk parse () metode. En form for JSON-slurper parse-metode tager en strøm som dens argument.

Dette er praktisk, fordi vi starter ved URL-slutningen åbne en strøm på en URL med dens newInputStream () fremgangsmåde.

Forudsat at vi har opbygget URL-strengen, det vil sige API-opkaldet, i en Groovy-strengvariabel kaldet urlString, kan vi åbne URL'en, læse den producerede strøm og analysere JSON med følgende Groovy-kode:

def resultat = (ny JsonSlurper ()). parse (ny InputStreamReader ((ny URL (urlString)). newInputStream ()))

Groovy-variablen resultere er et kort (det vil sige et sæt nøgleværdipar) og ser sådan ud:

[succes: sandt, termer: https: //currencylayer.com/terms, privatliv: https: //currencylayer.com/privacy, historisk: sandt, dato: 2018-01-01, tidsstempel: 1514851199, kilde: USD, citater : [USDCAD: 1.25551, USDEUR: 0.832296]]

Dette kort svarer nøjagtigt til den rå JSON vist ovenfor. For eksempel nøglen dato har værdien 2018-01-01.

Groovy giver os adgang til den værdi, der er tildelt til dato nøgle enten af:

resultere [ 'date']

or

result.date

en af ​​disse vil returnere værdien 2018-01-01.

Bemærk, at nøgletilbudet henviser til et kort med to nøgler: den ene, der giver konverteringen mellem amerikanske og canadiske dollars, den anden, der giver konverteringen mellem amerikanske dollars og den anden valuta af interesse. I ovenstående tilfælde kan disse fås adgang til disse

resultat ['citater'] ['USDCAD'] og resultatet ['citater'] ['USDEUR']

or

result.quotes.USDCAD og result.quotes.USDEUR.

Ved hjælp af sidstnævnte format og antages, at det originale beløb er i en Groovy-variabel amtOrig, kan beløbet i canadiske dollars beregnes som:

def amtCAD = amtOrig / result.quotes.USDEUR * result.quotes.USDCAD

Hvis jeg f.eks. Er nødt til at konvertere udgifter til amerikanske dollars, når jeg passerer gennem DFW lufthavn, er formlen enklere:

def amtCAD = amtOrig * result.quotes.USDCAD

Det er virkelig alt, hvad der er til det.

Det (næsten) fungerende script

Lad os gøre det til et fungerende Groovy-script. Vi henter argumenterne fra kommandolinjen og tjekker dem. Så hvis alt ser godt ud, bygger vi URL-strengen, kalder API'en og får resultatet i kortformat. Endelig trækker vi resultatkortet fra hinanden og beregner udvekslingen. Her er scriptet:

import groovy.json.JsonSlurper // Kontroller, at argumenter er korrekte, og udskriv brug, hvis ikke hvis (args.size ()! = 3) {System.err.println "brug: groovy fx.groovy åååå-mm-dd beløb valutakode "System.exit (1)} // Kontroller argumenter for formatering og rimelige værdier String dateString = args [0] hvis (! (dateString == ~ / (19dd | 2 [01] dd) - (0 [1 -9] | 1 [012]) - ([012] d | 3 [01]) /)) {1 System.err.println "fx.groovy date $ dateString ikke i format yyyy-mm-dd" System.exit (1)} String amountString = args [1] hvis (! (AmountString == ~ /d+(.d+)?/)) {1 System.err.println "fx.groovy beløb $ amountString ikke numerisk" System.exit ( 1)} String currencyCode = args [2] hvis (! (CurrencyCode == ~ / [AZ] [AZ] [AZ] /)) {1 System.err.println "fx.groovy valutakode $ currencyCode ikke tre kapital bogstaver, fx USD, CAD, EUR, GBP "System.exit (1)} // Vores gratis licens konverteres kun via USD, så vi justerer valutalisten // afhængigt af om den oprindelige valuta var USD eller noget andet String currencyCodeList = currencyCode == 'USD'? 'CAD': "CAD, $ {currencyCode}" 2 // Adgangsnøglekoden, der er givet under tilmelding af webstedet String accKey = 'a5bd4434d2299ecb3612ad297402481c' 3 // Byg URL-strengen til API-opkaldet, få JSON og analyser det String urlString = "http://apilayer.net/api/historical?access_key=$accKey&date=${dateString}&cururrency=${currencyCodeList}&format=1" 2 def result = (new JsonSlurper ()). parse (new InputStreamReader ((nyt) URL (urlString)). NewInputStream ())) // Vælg de returnerede værdier fra hinanden og beregne udvekslingsinfo BigDecimal amtOrig = new BigDecimal (amountString) 4 hvis (result.quotes.size ()> 1) {String toUSDString = 'USD '+ currencyCode BigDecimal amtCAD = amtOrig / result.quotes [toUSDString] * 5 result.quotes.USDCAD println "$ amtOrig $ currencyCode toUSD $ {result.quotes [toUSDString]} toCAD $ {result.quotes.USDCAD} $ amtCAD" XUM } andet {BigDecimal amtCAD = amtOrig * result.quotes.USDCAD println "$ amtOrig $ currencyCode toCAD $ {result.quotes.USDCAD} $ amtCAD" 2}

Et par kommentarer:

  1. Disse er regelmæssige udtryksmønster-matchninger. Ja, jeg kunne have brugt prøv ... fangst blokke.
  2. Notationen ... $ {foo} ... kaldes en Gstring i Groovy; tinget ind $ {} evalueres, og den værdi erstatter den i den endelige streng.
  3. Det er ikke min adgangsnøgle! Men det ser lidt ud som det.
  4. Jeg bruger BigDecimal snarere end fordoble at udføre mine beregninger.
  5. Jeg bruger [ToUSDString] for at få adgang til værdien; dette er fordi toUSDString er en variabel, ikke en konstant streng.
  6. Lange streger har viklet sig lidt rundt. Det er jeg ked af!

Hvis du ikke har brugt Groovy meget, vil nogle af ovenstående sandsynligvis virke lidt magiske, men det er det ikke - virkelig. Jeg håber, at dette tilskynder til yderligere undersøgelse!

Bemærk, at folk, der arbejder med amerikanske dollars som deres base, ikke behøver at gennemgå mellemliggende beregninger.

Og en sidste, forsigtig kommentar: Disse og andre historiske valutakurser er vejledende, beregnet generelt ud fra gennemsnit af andre tal. Så hvis det koste dig 2,623 Tjekkisk koruna at købe 100 Euro den februar 15, 2018, men Fixer.io giver dig en valutakurs på 25.370 Tjekkisk koruna til Euro på den dato, er det ikke en fejl! Du har muligvis betalt et andet beløb på en anden finansiel institution.

Kilde

Efterlad en kommentar