github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgExchangeRate/kmgExchangeRate.go (about) 1 package kmgExchangeRate 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/bronze1man/kmg/encoding/kmgJson" 8 "github.com/bronze1man/kmg/kmgCache" 9 "github.com/bronze1man/kmg/kmgNet/kmgHttp" 10 "github.com/bronze1man/kmg/kmgStrconv" 11 "github.com/bronze1man/kmg/kmgStrings" 12 "github.com/bronze1man/kmg/kmgTime" 13 ) 14 15 type yqlRateResponse struct { 16 Query struct { 17 Results struct { 18 Rate struct { 19 Rate string `json:"rate"` 20 } `json:"rate"` 21 } `json:"results"` 22 } `json:query` 23 } 24 25 //缓存时间为1天 26 func MustGetExchangeRateWithCache(from string, to string) float64 { 27 b, err := kmgCache.FileTtlCache("MustGetExchangeRateWithCache_"+from+"_"+to, func() (b []byte, ttl time.Duration, err error) { 28 f := MustGetExchangeRate(from, to) 29 return []byte(kmgStrconv.FormatFloat(f)), kmgTime.Day, nil 30 }) 31 if err != nil { 32 panic(err) 33 } 34 f, err := kmgStrconv.ParseFloat64(string(b)) 35 if err != nil { 36 panic(err) 37 } 38 return f 39 } 40 41 func MustGetExchangeRate(from string, to string) float64 { 42 if !kmgStrings.IsAllAphphabet(from) { 43 panic(fmt.Errorf("[MustGetExchangeRate] fromName [%s] should like USD", from)) 44 } 45 if !kmgStrings.IsAllAphphabet(to) { 46 panic(fmt.Errorf("[MustGetExchangeRate] toName [%s] should like USD", to)) 47 } 48 if from == to { 49 panic(fmt.Errorf("[MustGetExchangeRate] fromName [%s] =toName [%s] ")) 50 } 51 out := kmgHttp.MustUrlGetContent(kmgHttp.MustSetParameterMapToUrl("https://query.yahooapis.com/v1/public/yql", map[string]string{ 52 "q": fmt.Sprintf(`select * from yahoo.finance.xchange where pair="%s%s"`, from, to), 53 "format": "json", 54 "env": "store://datatables.org/alltableswithkeys", 55 "callback": "", 56 })) 57 //out should look like {"query":{"count":1,"created":"2015-06-01T02:37:44Z","lang":"en","results":{"rate":{"id":"JPYCNY","Name":"JPY/CNY","Rate":"0.0501","Date":"6/1/2015","Time":"3:37am","Ask":"0.0501","Bid":"0.0501"}}}} 58 resp := yqlRateResponse{} 59 kmgJson.MustUnmarshal(out, &resp) 60 if resp.Query.Results.Rate.Rate == "N/A" { 61 panic(fmt.Errorf("[MustGetExchangeRate] Currency [%s][%s] not exist", from, to)) //有一种货币不存在. 62 } 63 rate, err := kmgStrconv.ParseFloat64(resp.Query.Results.Rate.Rate) 64 if err != nil { 65 panic(err) 66 } 67 return rate 68 }