CodeMartain 2023-08-21 17:05 采纳率: 76.3%
浏览 3

golang中关于post请求的一个疑问


func HttpClientD() {
    open, _ := os.Open("./view.txt")
    //创建一个http客户端
    client := http.Client{}
    //创建一个请求
    request, _ := http.NewRequest("POST", "http://localhost:9991/auth/authentication/login", open)
    //cookies := request.Cookies()
    //cookie对象
    cookie := http.Cookie{
        Name:       "cookie",
        Value:      "cookie",
        Path:       "",
        Domain:     "",
        Expires:    time.Time{},
        RawExpires: "",
        MaxAge:     0,
        Secure:     false,
        HttpOnly:   false,
        SameSite:   0,
        Raw:        "",
        Unparsed:   nil,
    }
    //请求中添加cookie
    request.AddCookie(&cookie)

    //设置请求头,设置发送内容的格式
    request.Header.Set("Content-Type", "application/json; charset=UTF-8")
    //发送请求
    response, _ := client.Do(request)
    defer response.Body.Close()
    bytes := make([]byte, 1024)
    for true {
        _, err := response.Body.Read(bytes)
        if err == io.EOF {
            break
        }
        fmt.Println(string(bytes))
    }
    //获取请求中的参数
    fmt.Println(request.Cookie("cookie"))
}


type LoginUser struct {
    Username  string `json:"username"`
    Password  string `json:"password"`
    otherInfo string
}



func httpPost() {
    user := LoginUser{
        Username:  "567891",
        Password:  "密码",
        otherInfo: "json时被忽略",
    }
    //注意,这里json时忽略掉首字母小写的属性
    marshal, _ := json.Marshal(user)
    fmt.Println(string(marshal))

    //open, _ := os.OpenFile("/view.txt", os.O_CREATE|os.O_RDWR, fs.ModePerm)
    open, _ := os.Open("/view.txt")
    defer open.Close()

    //http客户端
    client := &http.Client{}

    //client.Get("/") //get请求
    //发送post请求

    resp, err := client.Post("http://localhost:9991/auth/authentication/login", "application/json;charset=UTF-8", open)//这种方式跟上面那中有区别
    //resp, err := client.Post("http://localhost:9991/auth/authentication/login", "application/json;charset=UTF-8", strings.NewReader(string(marshal)))
    //http返回的response的body必须close,否则就会有内存泄露
    defer resp.Body.Close()
    if err != nil {
        fmt.Println(err.Error())
    } else {
        if resp.StatusCode == 200 {
            all, _ := ioutil.ReadAll(resp.Body)
            fmt.Println(string(all))
        } else {
            all, _ := ioutil.ReadAll(resp.Body)
            fmt.Println(string(all))
        }

    }

}


go中使用client.Post()的方式跟上面 http.NewRequest() 的方式请求为什么会有不同? 或者下面的代码有什么问题?
为什么使用http.NewRequest() 时传的body 使用Reader就可以,而 client.Post()不可以?
看了下源码:也是调用NewRequest完成的请求,这是什么原因?

func (c *Client) Post(url, contentType string, body io.Reader) (resp *Response, err error) {
    req, err := NewRequest("POST", url, body)
    if err != nil {
        return nil, err
    }
    req.Header.Set("Content-Type", contentType)
    return c.Do(req)
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-21 18:15
    关注

    【以下回答由 GPT 生成】

    问题1:

    http.NewRequest方法的第三个参数是请求的Body,即请求体。在HttpClientD()函数中,open是一个io.Reader类型的对象,这里通过os.Open打开了一个文件并返回该文件作为Body。当我们发送POST请求时,可以将请求的数据作为Body发送给服务器,服务器可以从Body中获取到这些数据。在这个例子中,view.txt文件的内容将作为请求的Body发送给服务器。

    问题2:

    UsernamePassword字段是LoginUser结构体中的两个字段,它们的作用是存储用户的用户名和密码信息。当我们需要使用这些信息时,可以通过访问对应的字段来获取或设置这些值。在这个例子中,通过设置user.Usernameuser.Password来指定登录用户的用户名和密码。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 8月21日
  • 创建了问题 8月21日

悬赏问题

  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中