新手学习中遇到了一个问题,百度查了好久都没找到,请各位大佬指点一二,跪谢。
我有一个自己写的测试网页,登陆成功会自动跳转到新的页面,并会返回一个cookie值。
然后我使用net/http包的方法,尝试提交登录,发现虽然可以自动跳转,但是跳转的时候并没有保存第一个页面返回的cookie。
我有两个想请教一下:
1、我应该怎么写,才能保存我的cookie,可以正常访问登陆后的页面。
2、我怎么能不自动跳转,抓到第一个页面返回的内容。
以下是我写的代码:
```go
package main
import (
"net/http"
"strings"
"fmt"
"io/ioutil"
)
func main() {
resp, err := http.Post("http://192.168.123.32/login/index.php",
"application/x-www-form-urlencoded",
strings.NewReader("username=admin&password=admin&Login=%B5%C7%C2%BD"))
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
headers := resp.Header
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(headers)
fmt.Println(string(body))
}
```
秋的玛德,突然想起以前我也研究过类似需求,可以用下面这个更好的忽略重定向。看到你的问题时差不多忘记了,人老咯啊。
```go
client := &http.Client{ // 忽略证书验证
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}, // 不重定向:http://www.sohu.com/a/122147787_505779
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
Timeout: 5 * time.Second,
},
```
#3
更多评论
#### 对于新人来说看源码是有点困难,但是我建议你有空可以仔细看看源码是如何处理的。分析是否可以利用已有接口到目的。
#### 下面是我研究源码给出的方案,网上应该也有其他人这样用过吧,你看看有木有帮助。
```go
package main
import (
"io/ioutil"
"log"
"net/http"
"time"
)
func main() {
go server()
time.Sleep(time.Second)
mUrl := "http://127.0.0.1:12345/post"
{ // 常规方法
req, err := http.NewRequest(http.MethodPost, mUrl, nil)
if err != nil {
log.Fatal(err)
}
resp, err := http.DefaultClient.Do(req)
if resp != nil {
defer resp.Body.Close()
}
if err != nil {
log.Fatal(err)
}
byt, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
log.Println(resp.StatusCode, "|", string(byt))
}
{ // 去掉自动处理重定向
req, err := http.NewRequest(http.MethodPost, mUrl, nil)
if err != nil {
log.Fatal(err)
}
resp, err := http.DefaultTransport.RoundTrip(req)
if resp != nil {
defer resp.Body.Close()
}
if err != nil {
log.Fatal(err)
}
byt, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
log.Println(resp.StatusCode, "|", string(byt))
}
}
func server() {
http.HandleFunc("/post", mPost)
http.ListenAndServe(":12345", nil)
}
func mPost(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "http://www.baidu.com", http.StatusFound)
w.Write([]byte(time.Now().String()))
}
```
#1