当前位置: 首页 > 工具软件 > Requests-Go > 使用案例 >

Golang实战系列:Requests模块使用

仲孙飞文
2023-12-01

最近在用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)

}

 

 

转载于:https://my.oschina.net/u/264284/blog/3095937

 类似资料: