飞天惊鸿 發表於 2019-7-9 22:05:00

【Go】使用Go调用Rest接口

<p><span style="font-size: 16px">用SpringBoot写了一个几个简单的Rest接口,对一个计数器进行查询,设置和增加,具体可以看:</span></p>
<p><span style="font-size: 16px; color: rgba(255, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">https://www.cnblogs.com/wuyizuokan/p/11117294.html</span></span></p>
<p><span style="font-size: 16px">废话不多说,直接上Go代码:</span></p>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">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 := &amp;Count{}
        json.Unmarshal(body, rspCount)// 解析请求到结构体

        return rspCount.Count, nil
}</pre>
</div>
<p><span style="font-size: 16px">先启动SpringBoot服务:</span></p>
<p><img src="https://img2018.cnblogs.com/blog/1236645/201907/1236645-20190709220212819-1624056252.png" alt=""></p>
<p><span style="font-size: 16px">运行Go代码的结果:</span></p>
<p><img src="https://img2018.cnblogs.com/blog/1236645/201907/1236645-20190709220251918-1669588088.png" alt=""></p>
<p><span style="font-size: 16px">符合预期。</span></p>
<p><span style="font-size: 16px">使用Postman查询:</span></p>
<p><img src="https://img2018.cnblogs.com/blog/1236645/201907/1236645-20190709220326113-365039671.png" alt=""></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    时间总是悄悄流逝<br><br>
来源:https://www.cnblogs.com/wuyizuokan/p/11160790.html
頁: [1]
查看完整版本: 【Go】使用Go调用Rest接口