英文:
Golang: how to follow location with cookie
问题
如果HTTP请求的响应是一个带有cookie的重定向(HTTP代码302),你可以如何指示你的Go客户端跟随新的位置并携带接收到的cookie?
在Go中,你可以通过设置以下参数来实现类似的功能:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/cookiejar"
"net/url"
)
func main() {
// 创建一个cookie jar来存储cookie
cookieJar, _ := cookiejar.New(nil)
// 创建一个http client,并设置cookie jar
client := &http.Client{
Jar: cookieJar,
}
// 创建一个GET请求
req, _ := http.NewRequest("GET", "http://example.com", nil)
// 发送请求
resp, _ := client.Do(req)
// 检查响应的状态码
if resp.StatusCode == http.StatusFound {
// 获取重定向的URL
redirectURL, _ := resp.Location()
// 创建一个新的GET请求,带上之前接收到的cookie
req, _ = http.NewRequest("GET", redirectURL.String(), nil)
// 发送请求
resp, _ = client.Do(req)
}
// 读取响应的内容
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
上述代码中,我们使用了net/http
包和net/http/cookiejar
包来实现跟随重定向并携带cookie的功能。首先,我们创建了一个cookie jar来存储cookie。然后,我们创建了一个http client,并将cookie jar设置为client的jar属性。接下来,我们发送一个GET请求,并检查响应的状态码。如果状态码是302(重定向),我们获取重定向的URL,并创建一个新的GET请求,带上之前接收到的cookie。最后,我们发送这个新的请求,并读取响应的内容。
请注意,上述代码中的错误处理部分被省略了,你可以根据实际情况进行错误处理。
英文:
In case the response to an http request is a redirection (http code 302) with a cookie,
how can you instruct your Go client to follow the new location with the cookie that has been received?
in CURL, this can be easily achieved by setting the client with:<br>
COOKIEFILE = ""
AUTOREFERER = 1
FOLLOWLOCATION = 1
how can you do that in Go?
答案1
得分: 34
使用Go 1.1,你可以使用net/http/cookiejar
来实现这个功能。
下面是一个可工作的示例:
package main
import (
"golang.org/x/net/publicsuffix"
"io/ioutil"
"log"
"net/http"
"net/http/cookiejar"
)
func main() {
options := cookiejar.Options{
PublicSuffixList: publicsuffix.List,
}
jar, err := cookiejar.New(&options)
if err != nil {
log.Fatal(err)
}
client := http.Client{Jar: jar}
resp, err := client.Get("http://dubbelboer.com/302cookie.php")
if err != nil {
log.Fatal(err)
}
data, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
log.Fatal(err)
}
log.Println(string(data))
}
希望对你有帮助!
英文:
With Go 1.1 you can use the net/http/cookiejar
for that.
Here is a working example:
package main
import (
"golang.org/x/net/publicsuffix"
"io/ioutil"
"log"
"net/http"
"net/http/cookiejar"
)
func main() {
options := cookiejar.Options{
PublicSuffixList: publicsuffix.List,
}
jar, err := cookiejar.New(&options)
if err != nil {
log.Fatal(err)
}
client := http.Client{Jar: jar}
resp, err := client.Get("http://dubbelboer.com/302cookie.php")
if err != nil {
log.Fatal(err)
}
data, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
log.Fatal(err)
}
log.Println(string(data))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论