我想發送一個帶有登錄資料的 GET 請求并將 cookie 資料保存到 txt 檔案。
我有一個卷曲資料
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
我需要將此 curl 轉換為 Go;我試過在線轉換器,它給出了錯誤,我認為他們沒有任何能力將 cookie 存盤到 txt 檔案。
我有一個示例 Go 檔案,它無法發送用戶名和密碼,但我認為它確實保存了 cookies.txt 檔案:
我的 main.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'到 Go 中。
uj5u.com熱心網友回復:
當您使用 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 請求不用于在正文中傳輸資料,因此在給出正確POST時使用 as curl 會自動執行。data-raw
根據您的示例標題和資料,data-raw您似乎正在使用表單值,這些值也可以指定為:
curl localhost -F 'username=admin' -F 'password=pasxxord7'
這將添加內容型別的 multipart/form-data 標頭并自動作為 POST 發送。這樣做的好處是也可以進行任何必要的轉義。
在 Go 中重新創建 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,但如果您添加其他標頭,則應該是完整的。
You don't need to use a Cookie Jar because that is used to store and send cookies with an outgoing request. It appears you are only interested in storing the cookies sent back from the server and so you need to call the .Cookies() method on the response and use what is returned.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442082.html
