Golang http. Получите слишком много перенаправлений - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь загрузить файл из Интернета. Это должны быть простые процессы. Тот, который я уже сделал ранее. Но эта конкретная ссылка (zip-файл размером 135 кБ) выдает мне сообщение об ошибке: Get "http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip": stopped after 10 redirect. Если я скопирую ссылку в браузер, файл загрузится без проблем, но при использовании приведенного ниже кода появится сообщение об ошибке.

package main

import (
    "io"
    "net/http"
    "os"
)

func main() {
    link := "http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip"
    resp, err := http.Get(link)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // Create the file
    out, err := os.Create("ms.zip")
    if err != nil {
        panic(err)
    }
    defer out.Close()

    // Write the body to file
    _, err = io.Copy(out, resp.Body)
    if err != nil {
        panic(err)
    }
}

Любые идеи о том, почему это происходит и как обойти это. ?

Спасибо за внимание.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

После изучения этого URL я вижу, что он устанавливает cook ie Set-Cookie: security=true; path=/

Вы можете установить cook ie вручную или использовать CookieJar

    c := http.Client{}
    req, err := http.NewRequest("GET", link, nil)
    if err != nil {
        panic(err)
    }
    req.AddCookie(&http.Cookie{Name: "security", Value: "true", Path: "/"})

    resp, err := c.Do(req)
    if err != nil {
        panic(err)
    }
1 голос
/ 16 апреля 2020

Ваш код полностью в порядке, но вы часто обнаружите, что эта проблема больше связана с источником, из которого вы пытаетесь загрузить файл, а не с Go.

. была та же проблема с другими инструментами / языками, потому что хост, к которому вы пытаетесь обратиться, продолжает перенаправлять вас из-за недопустимого свойства заголовка 'User-Agent' . Это часто бывает, когда вы хотите разрешить загрузку ваших файлов только из «браузеров», а не для сканирования, автоматических сценариев и т. Д. c.

С помощью Go вы можете добавить свойство заголовка с помощью req.Header.Set("User-Agent", "<some-user-agent-value>"), перед отправкой запроса. Вы должны создать экземпляр request, установить заголовок и выполнить его с http.Client{} и client.Do(req).

Например:

    link := "http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip"
    req, err := http.NewRequest("GET", link, nil)
    if err != nil {
        panic(err)
    }
    req.Header.Set("User-Agent", "Mozilla/4.0") // Doesn't even have to be a full
                                                // proper user agent string
    client := &http.Client{}
    resp, err := client.Do(req)

Подробнее можно прочитать в 1040 * http pkg docs гласит:

"Для контроля над заголовками клиентов HTTP, политикой перенаправления и другими настройками создайте клиента ..."

Вот также http.reqeust и http.client документы.

Подробнее об этом общем вы можете узнать, например, Документы HTTP Mozilla , а также множество других замечательных документов и ресурсов.

Кстати. ZIP-архив, который вы пытаетесь загрузить, кажется недействительным. : -)

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