我想发送一个带有登录数据的GET请求,并将cookie数据保存到txt文件中.

我有一个curl 数据

   curl -c cookies.txt 'http://localhost:8080/api/v2/auth/login' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98"' \
  -H 'sec-ch-ua-mobile: ?1' \
  -H 'User-Agent: Mozilla/5.0 (Linux; Android 9; BND-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.106 Mobile Safari/537.36' \
  -H 'Content-type: application/x-www-form-urlencoded; charset=UTF-8' \
  -H 'Accept: text/javascript, text/html, application/xml, text/xml, */*' \
  -H 'Referer: http://localhost:8080/' \
  -H 'X-Requested-With: XMLHttpRequest' \
  -H 'sec-ch-ua-platform: "Android"' \
  --data-raw 'username=admin&password=pasxxord7' \
  --compressed

我需要把这个卷发转换成卷发;我try 过在线转换器,它给出了错误,我认为他们没有任何能力将cookies存储到txt文件中.

我有一个示例Go文件,它没有发送用户名和密码的功能,但我认为它可以保存cookies.txt文件:

我的主菜.go目录:

package main

import "net/http/cookiejar"
import "net/http"
import "encoding/json"
import "io/ioutil"
import "fmt"

func main(){
    cookies := make(map[string][]*http.Cookie)
    jar, _ := cookiejar.New(nil)
    client := http.Client{Jar: jar}
    r, err := client.Get("http://localhost:8080/api/v2/auth/login")
    if err != nil {
        fmt.Println(err)
        return
    }
    siteCookies := jar.Cookies(r.Request.URL)
    cookies[r.Request.URL.String()] = siteCookies
    data, _ := json.Marshal(cookies)
    ioutil.WriteFile("cookies.txt", data, 0644)
}

我主要需要转换并添加这个curl 标志和数据--data-raw 'username=admin&password=pasxxord7'.

推荐答案

使用curl标志时,--data-raw发送POST请求.您可以使用详细输出标志-v来验证这一点,例如:

$ curl -c cookies.txt 'http://requestbin.net/r/40vmgerp' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98"' \
  -H 'sec-ch-ua-mobile: ?1' \
  -H 'User-Agent: Mozilla/5.0 (Linux; Android 9; BND-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.106 Mobile Safari/537.36' \
  -H 'Content-type: application/x-www-form-urlencoded; charset=UTF-8' \
  -H 'Accept: text/javascript, text/html, application/xml, text/xml, */*' \
  -H 'Referer: http://localhost:8080/' \
  -H 'X-Requested-With: XMLHttpRequest' \
  -H 'sec-ch-ua-platform: "Android"' \
  --data-raw 'username=admin&password=pasxxord7' \
  --compressed -v

* Connected to requestbin.net (172.67.190.62) port 80 (#0)
> POST /r/40vmgerp HTTP/1.1 <--------------------
> Host: requestbin.net
> Accept-Encoding: deflate, gzip
> sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98"
> sec-ch-ua-mobile: ?1
...

一般来说,GET请求不用于在体内传输数据,所以当给出data-raw时,使用POST作为curl自动执行是正确的.

根据您的示例标题和data-raw的数据,您似乎正在使用表单值,也可以指定为:

curl localhost -F 'username=admin' -F 'password=pasxxord7'

这将添加内容类型multipart/form数据头,并自动发送为POST.这样做的好处是可以进行任何必要的逃跑.


请按照以下要求重新创建curl :

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/url"
    "os"
    "strings"
)

func main() {
    data := url.Values{}
    data.Set("username", "admin")
    data.Set("password", "pasxxord7")

    body := strings.NewReader(data.Encode())

    req, err := http.NewRequest(http.MethodPost, "https://requestbin.net/r/40vmgerp", body)
    if err != nil {
        panic(err)
    }

    // Omitted other headers for brevity.
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
    req.Header.Set("Accept", "text/javascript, text/html, application/xml, text/xml, */*")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    cookies := resp.Cookies()

    if len(cookies) > 0 {
        cookieFile, err := os.Create("cookies.txt")
        if err != nil {
            panic(err)
        }
        defer cookieFile.Close()

        encoder := json.NewEncoder(cookieFile)

        for _, cookie := range cookies {
            // fmt.Fprintln(cookieFile, cookie.String()) // write plain text to file
            if err := encoder.Encode(cookie); err != nil {
                panic(err)
            }
        }
    } else {
        fmt.Println("No cookies found.")
    }
}

注意:上面的示例使用RequestBin而不是localhost,但是如果添加其他头,则应该是完整的.

您不需要使用Cookie Jar,因为它用于存储和发送带有传出请求的Cookie.似乎您只对存储从服务器返回的cookie感兴趣,因此您需要对响应调用.Cookies()方法,并使用返回的内容.

Go相关问答推荐

T的Golang通用切片,其中 *T实现接口

Go 1.22 net/http群组路由

如何修复在Go API中使用Gin Framework的请求资源上没有使用Gin Framework的请求源的消息?''

在不耗尽资源的情况下处理S3文件下载

即使HTTP服务器正在使用GO和Protobuf、SQL Server启动,请求也不返回结果

如何使用 AWS sdk 在 Go 中正确解组 PartiQL 查询的结果?

切片的下限和上限

如何在 Go 服务中导入 monorepo 中的包?

尽管存在 WaitGroup,Goroutines 似乎被打断了

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

使用 LINQ 对内部数组进行排序

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

无法使用 gocsv 读取引用字段

整理时转换值

Golang prometheus 显示自定义指标

Go:等待多个通道的性能损失

Golang - 使用正则表达式提取链接

为什么在 goroutine 中声明时,benbjohnson/clock 模拟计时器不执行?

Go:如何通过 GIN-Router 从 AWS S3 将文件作为二进制流发送到浏览器?

有没有办法在golang中映射一组对象?