Как повторно использовать запрос POST и перезаписать его полезную нагрузку? - PullRequest
0 голосов
/ 15 марта 2020

У меня есть случай, когда клиент Go с наблюдателем файлов прослушивает изменения в файле и отправляет эти изменения на сервер Go. Если Клиент не может связаться с сервером во время POST запросов с полезной нагрузкой изменений файла, Клиент будет каждые 3 секунды пытаться отправить запрос, пока err := http.NewRequest() не вернет не ноль err

Но если клиент в настоящее время пытается каждые 3 секунды отправлять запрос POST, но в то же время происходит новое изменение в файле под наблюдением файла, я хочу, чтобы полезная нагрузка текущих POST запросов была равна быть перезаписан новой полезной нагрузкой (новые изменения из файла)

Как мне архивировать это лучше?

Клиентский код для отправки HTTP-запросов

func makeRequest(method string, body io.Reader) (*http.Response, error) {
    client := &http.Client{}
    request, err := http.NewRequest(.., .., ..)
    if err != nil {
        log.Println("Error: Couldn't make a new Request:", err)
        return nil, err
    }
    response, err := client.Do(request)
    if err != nil {
        log.Printf("Error: Couldn't execute %s request:%s", method, err)
    }
    return response, err
}

Функция, которая повторяется до err! = Nil

func autoRetry(f func() error) {
    if err := backoff.Retry(f, getBackOff()); err != nil {
        log.Println("Error: Couldn't execute exponential backOff retries: ", err)
    }
}

autoRetry() - это просто функция, которая принимает функцию и использует ExponentialBackOff для вычисления количества попыток до err !=nil

Вызов метод, выполняющий запрос POST с повторными попытками

func postTodo() {
    autoRetry(func() error {
        r, err := makeRequest("POST", getFileData())
        if err != nil {
            return err
        }
        if r.StatusCode != 200 {
            return errors.New("Error:" + r.Status)
        }
        return nil
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...