【Go】使用Go调用Rest接口
用SpringBoot写了一个几个简单的Rest接口,对一个计数器进行查询,设置和增加,具体可以看:
https://www.cnblogs.com/wuyizuokan/p/11117294.html
废话不多说,直接上Go代码:
package main import ( "fmt" "net/http" "encoding/json" "bytes" "strings" "io/ioutil" "github.com/garyburd/redigo/redis" "errors" "time" ) // 请求URL const COUNT_URL ="http://localhost:8080/me/count" // 定义一个Count结构体 type Count struct { Count int `json:"count"` } func main(){ // 测试查询函数 count,err := getCount() if err != nil { fmt.Println(err) return } fmt.Println("count: ", count) // 初始计数为0,预计结果为0 // 测试设置函数 err = setCount(200) if err != nil { fmt.Println(err) return } count,err = getCount() if err != nil { fmt.Println(err) return } fmt.Println("count: ", count) // 设置函数设置为了200,预计查询结果为200 // 测试增加函数 err = addCount(50) if err != nil { fmt.Println(err) return } count,err = getCount() if err != nil { fmt.Println(err) return } fmt.Println("count: ", count) // 增加函数增加了50,预计查询结果为250 } /** 给Count加上一个值 */ func addCount(count int) error { reqCount := Count{Count:count} // 构造请求结构体 reqCountBytes, err :=json.Marshal(reqCount) // 把请求结构体解析为json if err != nil { fmt.Println("marshal failed. the error info: ",err) } _,err = http.Post(COUNT_URL,"application/json", bytes.NewBuffer(reqCountBytes)) // 调用rest接口 if err != nil { return err } return nil } /** 给Count加上一个值,比如Count初始为10,输入20,Count会变为30 */ func setCount(count int) error { reqCount := Count{Count:count} // 构造请求结构体 reqCountBytes, err :=json.Marshal(reqCount) // 把请求结构体解析为json if err != nil { fmt.Println("marshal failed. the error info: ",err) return err } req,err :=http.NewRequest(http.MethodPut,COUNT_URL,strings.NewReader(string(reqCountBytes))) // 因为要调用的Rest接口是PUT类型的,需要先构造Request if err != nil { fmt.Println("new request failed with error: %s", err) return err } req.Header.Set("Content-Type", "application/json") // 注意要给Request的请求头添加上内容类型 client := http.Client{} // 创建一个httpClient _,err=client.Do(req) // 调用rest接口 if err != nil { return err } return nil } /** 获取Count值 */ func getCount() (count int, err error) { rsp,err :=http.Get(COUNT_URL) // Get接口直接调用就行了 if err != nil { fmt.Println("get count has some error. the error info: ",err) return -1, err } defer rsp.Body.Close() // defer语句类似于java中的try-catch-finally的finally,即在函数推出的时候,执行defer中的语句 body, err := ioutil.ReadAll(rsp.Body) // 读取响应中的数据 if err != nil { fmt.Println("get count has some error. the error info: ",err) return -1, err } rspCount := &Count{} json.Unmarshal(body, rspCount) // 解析请求到结构体 return rspCount.Count, nil }
先启动SpringBoot服务:
运行Go代码的结果:
符合预期。
使用Postman查询:
时间总是悄悄流逝