最近在用Golang写一个Agent,后端Web Server是Python Django(当然也适用于Golang)。
python requests模块发送post请求后拿请求返回的数据可以通过某些方式直接生成python 字典,再通过字典可以直接拿到token,如:
r = requests.post(self.login_url, data=json.dumps(payload), headers=self.headers)
login_result = r.json()
token = login_result.get('token')
但是,golang 的某些第三方包不支持这种搞法,返回的是一个json字符串,需要自己反序列化成map或struct,因此操作要稍微麻烦一点!
package main
import (
"encoding/json"
"fmt"
r "github.com/solos/requests"
)
func main() {
kwargs := r.M{}
kwargs["timeout"] = 10
// 设定请求头
headers := map[string]string{
"content-Type": "application/json",
}
// 设定POST请求数据
data := map[string]string{
"username": "admin",
"password": "adminn@123",
}
// 实例化一个请求对象
req := &r.Request{Args: kwargs}
// POST登录,获取Token(后端token是基于JWT)
loginUrl := `http://127.0.0.1:8000/login/`
resp, err := req.MakeRequest("POST", loginUrl, r.Headers(headers), r.Data(data))
if err != nil {
fmt.Printf("获取Token失败... %s", err)
return
// panic(fmt.Sprintf("获取Token失败... %s", err))
}
// 定义并初使化一个值为任意类型的map,用于装载反序列化后生成的数据
dataMap := make(map[string]interface{})
// 把后端返回的json字符串转换为[]byte
dataBytes := []byte(resp.Content)
// 反序列化成map
err = json.Unmarshal(dataBytes, &dataMap) // 这里注意,一定要是传入指针类型
if err != nil {
fmt.Printf("反序列化成map失败... %s", err)
return
// panic(fmt.Sprintf("反序列化成map... %s", err))
}
/*
注意不能用以下方式直接拿到token:
data1 := dataMap["data"] // 得到一个子map类型
data2 := data1["token"]
以上会提示:map type interface {} does not support indexing
要用以下方法:token := dataMap["data"].(map[string]interface{})["token"]
后端返回的原生数据:{"code":20000,"message":"ok","data":{"token":"eyiOi.....q1Hags"}}
反序列化后的数据:map[message:ok data:map[token:eyiOi.....q1Hags]
*/
// 提取token字符串
token := dataMap["data"].(map[string]interface{})["token"]
// 再在headers 加上认证
headers["Authorization"] = fmt.Sprintf("JWT %s", token)
// 向后端api拿数据
apiUrl := "http://127.0.0.1:8000/user/users/"
resp, _ = req.MakeRequest("GET", apiUrl, r.Headers(headers))
fmt.Printf("%v\n", resp.Content)
}