Как использовать два клиента. Используйте Голанг - PullRequest
0 голосов
/ 24 апреля 2018

Я использую пакет go / net / http, и я хочу опубликовать URL-адрес для входа, а затем получить страницу узла, которую я хочу использовать дважды, клиент. Делайте, потому что куки Вот мой кодя получаю эту ошибку паника: назначение записи в nil карте Как я могу использовать дважды client.Do в одном коде?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Произошла ошибка в request.go (строка 389):

// AddCookie adds a cookie to the request. Per RFC 6265 section 5.4,
// AddCookie does not attach more than one Cookie header field. That
// means all cookies, if any, are written into the same line,
// separated by semicolon.
func (r *Request) AddCookie(c *Cookie) {
    ...
    if c := r.Header.Get("Cookie"); c != "" {
        r.Header.Set("Cookie", c+"; "+s)
    } else {
        r.Header.Set("Cookie", s)
    }
}

Посмотрите, что запрос пытается установить заголовок.Если вы сделаете заголовок, будет работать.

nodeReq := &http.Request{
    Method: "GET",
    URL:    nodeUrl,
    TLS:    resp.TLS,
    Header: make(Header),
}

Подходящим методом является http.NewRequest.Ссылка: https://golang.org/pkg/net/http/#NewRequest

В http.NewRequest (строка request.go 778) заголовок создается следующим образом:

req := &Request{
    Method:     method,
    URL:        u,
    Proto:      "HTTP/1.1",
    ProtoMajor: 1,
    ProtoMinor: 1,
    Header:     make(Header),
    Body:       rc,
    Host:       u.Host,
}

Также смотрите, что если вы используете HTTP, не-HTTPS,Заголовок не требуется и тоже будет работать !!

0 голосов
/ 25 апреля 2018

Паника возникает из-за того, что Request.Header не инициализируется, на втором Client.Do куки не могут добавить к Request.Header (NodeReq), В этой ссылке я узнаю, как самостоятельно добавить заголовок Одно решение -

v := url.Values{}
v.Add("email", "1231231231@qq.com")
v.Add("passwd", "1231231231")

req, err := http.NewRequest("POST", "https://pro.v2bz.com/auth/login", strings.NewReader(v.Encode()))
req.PostForm = v
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

Во втором Запрос , поскольку @ aristofanio-garcia скажет использовать

nodeReq := &http.Request{
    Method: "GET",
    URL:    nodeUrl,
    Header: make(http.Header), //add this to initialize Request.Header so the cookies could add into header
}
0 голосов
/ 24 апреля 2018

Ошибка не в том, что вы используете client.Do дважды.На самом деле вы можете назвать это много раз.Сообщение об ошибке указывает, что где-то есть доступ к нераспределенной переменной (map).В вашем случае переменная, вызывающая ошибку, равна Request.Header.Используйте соответствующий метод для построения запроса, например, http.NewRequest :

nodeReq, err := http.NewRequest("GET", nodeUrl, nil)

При выполнении запроса POST для отправки содержимого формы используйте Client.PostForm , например

resp, err := client.PostForm(loginUrl, v)

Этот метод установит соответствующий заголовок Content-Type, затем вызовет client.Do.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...