我们在后端服务中有时要进行数据之间的交流,所以在这里我说一下用后端模拟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数据,这样我们就可以把其他服务的数据返回给前端了。