• 【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查询:

  • 相关阅读:
    多线程编程学习笔记——任务并行库(三)
    多线程编程学习笔记——任务并行库(二)
    多线程编程学习笔记——任务并行库(一)
    多线程编程学习笔记——线程池(三)
    多线程编程学习笔记——线程池(二)
    多线程编程学习笔记——线程池(一)
    多线程编程学习笔记——线程同步(三)
    多线程编程学习笔记——线程同步(二)
    多线程编程学习笔记——线程同步(一)
    多线程编程学习笔记-基础(三)
  • 原文地址:https://www.cnblogs.com/wuyizuokan/p/11160790.html
Copyright © 2020-2023  润新知