后端数据交互一:Golang模拟前端请求

后端数据交互一:Golang模拟前端请求

我们在后端服务中有时要进行数据之间的交流,所以在这里我说一下用后端模拟http请求去访问其他后端服务的方法。

创建请求连接

	//生成要访问的url
	url := "http://192.168.235.128:8080"
	//http请求
	request, err := http.NewRequest("POST", url, "nil")
  // request, err := http.NewRequest("POST", url, body)

第二行:我们定义一个url用来储存要请求服务的地址
第四行:我们用http包的NewRequest()函数来创建连接,第一个参数是请求方式,第二个参数是访问地址,第三个放http请求的body(如第五行),在这里我们用不到,所以我们设置为空

访问连接

//生成clint 参数为默认
	client := &http.Client{}
  //处理返回结果
	response, err := client.Do(request)

第二行:我们模拟一个用户对象client。
第四行:用client对象去访问要访问的服务,然后返回一个*http.Request对象

解析数据

// 将结果定位到标准输出 也可以直接打印出来 或者定位到其他地方进行相应的处理
	jsonData, err = ioutil.ReadAll(response.Body) //获取post的数据
	fmt.Println(string(jsonData))
	if err != nil {
		log.Println("response.Body err:", err)
	}
	err = json.Unmarshal(jsonData, &redisStatus)
	if err != nil {
		log.Println("fixedRefresh Unmarshal json err 2:", err)
		pb.ResponseServe(w, &returnArg, 404, "error")
	}

当我们接收到其他服务返回来的响应对象时,我们就可以把他body里面的json数据解析出来。

完整代码

这个例子是从前端接收到请求然后再拿前端请求里的数据去访问其他服务,最终获得想要的数据然后再返回给前端。

package ssf

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"studentStatus/pb"
)

func fixedRefresh(w http.ResponseWriter, r *http.Request) {
	returnArg := pb.ReturnArg{} //响应对象

	jsonData, err := ioutil.ReadAll(r.Body) //获取post的数据
	if err != nil {
		log.Println("fixedRefresh readAll json err:", err)
		pb.ResponseServe(w, &returnArg, 404, "error")
		return
	}
	defer r.Body.Close()

	var redisStatus pb.RedisStatus //定义初始化化redis数据的
	err = json.Unmarshal(jsonData, &redisStatus)
	if err != nil {
		log.Println("fixedRefresh Unmarshal json er:", err)
		pb.ResponseServe(w, &returnArg, 404, "error")
		return
	}
	redisStatus.Fid = redisStatus.BuildingNo
	data, err := json.Marshal(redisStatus)
	if err != nil {
		log.Println("fixedRefresh Marshal json err:", err)
	}

	body := bytes.NewBuffer(data) //转化[]byte
	//生成clint 参数为默认
	client := &http.Client{}

	//生成要访问的url
	url := "http://192.168.235.128:9090/returnSno"

	//http请求
	// request, err := http.NewRequest("POST", url, body)
	request, err := http.NewRequest("POST", url, body)
	if err != nil {
		log.Println("request err:", err)
		return
	}

	//处理返回结果
	response, err := client.Do(request)
	if err != nil {
		log.Println("response err:", err)
		return
	}
	// 将结果定位到标准输出 也可以直接打印出来 或者定位到其他地方进行相应的处理
	jsonData, err = ioutil.ReadAll(response.Body) //获取post的数据
	fmt.Println(string(jsonData))
	if err != nil {
		log.Println("response.Body err:", err)
		return
	}
	err = json.Unmarshal(jsonData, &redisStatus)
	if err != nil {
		log.Println("fixedRefresh Unmarshal json err 2:", err)
		pb.ResponseServe(w, &returnArg, 404, "error")
		return
	}
}
func main() {

	http.HandleFunc("/fixedRefresh", fixedRefresh) //特定时间刷新学生临时记录
	if err := http.ListenAndServe(":8090", nil); err != nil {
		log.Fatal("ListenAndServe:", err)
	}
}

从上例第十一行与第五十九行我们可知无论在http.Request中还是在http.Reponse中都可以读取body中的json数据,这样我们就可以把其他服务的数据返回给前端了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值