zoukankan      html  css  js  c++  java
  • 查询深圳通相关信息

    用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。
    注意:获取的并不是实时的深圳通信息

    Warm up

    • strconv.ParseUint: 解析无符号的数值字符串
      func ParseInt(s string, base int, bitSize int) (i uint64, err error)
      参数1 数字的字符串形式
      参数2 数字字符串的进制:二进制、八进制、十进制、十六进制
      参数3 返回结果的bit大小,也就是int8 int16 int32 int64

    • encoding/json.Unmarshal: 解析 JSON 编码的数据
      json.Unmarshal
      go-simplejson

    代码

    // 从开放的 Api 中查询深圳通相关信息。
    // API: http://api.oupag.com/dev/api/shenzhentong.php?cardno=29444xxxx
    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"io/ioutil"
    	"net/http"
    	"os"
    	"path/filepath"
    	"strconv"
    )
    
    //结构化存储 Api 返回的 JSON 数据,注意字段首字母必须大写
    type szTong_s struct {
    	ID            uint64 `json:"card_number"`
    	Balance       string `json:"card_balance"`
    	Balance_time  string `json:"balance_time"`
    	Validity_time string `json:"card_validity"`
    	Server_time   string `json:"current_time"`
    }
    
    //打印使用帮助
    func prtHelp(exitCode int) {
    	fmt.Println("
    查询深圳通的信息。")
    	fmt.Printf("    Usage: %s <卡号>
    
    ", filepath.Base(os.Args[0]))
    	os.Exit(exitCode)
    }
    
    //检查用户输入的深圳通 ID 是否为 uint64, 如果不正确则直接退出
    func check_szTongID() (ID string) {
    	defer func() {
    		//如果用户没有传入参数,即捕获 os.Args[1] 的索引错误
    		if err := recover(); err != nil {
    			prtHelp(1)
    		}
    	}()
    
    	if len(os.Args) == 1 {
    		prtHelp(0)
    	} else {
    		if _, err := strconv.ParseUint(os.Args[1], 10, 64); err != nil {
    			prtHelp(1)
    		}
    	}
    	return os.Args[1]
    }
    
    // 从 API 中获取深圳通信息(JSON),并解析成 struct
    func fetch_szTong(ID string) (szTong_ptr *szTong_s, err error) {
    	var URL = "http://api.oupag.com/dev/api/shenzhentong.php?cardno=" + ID
    
    	var szTong_b []byte
    	if response, err := http.Get(URL); err != nil {
    		return szTong_ptr, err
    	} else {
    		if szTong_b, err = ioutil.ReadAll(response.Body); err != nil {
    			return szTong_ptr, err
    		}
    	}
    
    	szTong_ptr = &szTong_s{}
    	err = json.Unmarshal(szTong_b, szTong_ptr) // JSON to Struct
    	return szTong_ptr, err
    }
    
    //格式化输出深圳通信息
    func Print_szTong(szTong *szTong_s) {
    	fmt.Println("
    深圳通查询结果:
    ")
    
    	if szTong.ID == 0 {
    		fmt.Println("    <卡号无效>
    ")
    	} else {
    		fmt.Printf("    %-20s : %d
    ", "Card NO.", szTong.ID)
    		fmt.Printf("    %-20s : %s
    ", "Validity date", szTong.Validity_time)
    		fmt.Printf("    %-20s : %s
    ", "Balance", szTong.Balance)
    		fmt.Printf("    %-20s : %s
    ", "Last balance time", szTong.Balance_time)
    		fmt.Printf("    %-20s : %s
    ", "Server current time", szTong.Server_time)
    	}
    }
    
    func main() {
    	szTongID := check_szTongID()
    
    	if szTong, err := fetch_szTong(szTongID); err != nil {
    		fmt.Println(err)
    		os.Exit(1)
    	} else {
    		Print_szTong(szTong)
    	}
    }
    

    例图

  • 相关阅读:
    HDU 5486 Difference of Clustering 图论
    HDU 5481 Desiderium 动态规划
    hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
    HDU 5478 Can you find it 随机化 数学
    HDU 5477 A Sweet Journey 水题
    HDU 5476 Explore Track of Point 数学平几
    HDU 5475 An easy problem 线段树
    ZOJ 3829 Known Notation 贪心
    ZOJ 3827 Information Entropy 水题
    zoj 3823 Excavator Contest 构造
  • 原文地址:https://www.cnblogs.com/bing-l/p/4064836.html
Copyright © 2011-2022 走看看