Golang http запрос POST работает один раз - PullRequest
0 голосов
/ 13 июня 2018

У меня есть хозяин и раб.Мастер имеет результат вызова API, который принимает JSON.И у меня есть proplem с slave, который отправляет этот результат на master, в первый раз мой код отправляет json хорошо, но во второй раз, код останавливается (программа ждет .....) на resp, err := client.Do(req), когда создается запрос на master.код salve:

func main (){
    for {
        // some code, very long code
        sendResult(resFiles)
    }
}

func sendResult(rf common.ResultFiles) {
    jsonValue, err := json.Marshal(rf)
    req, err := http.NewRequest(methodPost, ResultAdress, 
                                bytes.NewBuffer(jsonValue))
    req.Header.Set("Content-Type", ContentType)
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    fmt.Println("response Status:", resp.Status)
}

мастер-вызов API:

func result(c echo.Context) error {
    rf := &ResultFiles{}
    err := c.Bind(rf)
    if err != nil {
        log.Fatal(err)
    }
    rfChannel <- *rf
    return c.JSON(http.StatusOK, nil)
}

Мой вопрос: почему?Может быть проблема в стандартном клиентском golang (http.Client) или тайм-аут?Если я установил тайм-аут - мой код завис по тайм-ауту))) ожидается .... Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

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

0 голосов
/ 13 июня 2018

Вам нужно добавить тайм-аут в ваш http.Client.По умолчанию для http.Client задано время ожидания 0, что означает отсутствие времени ожидания вообще.Так что если сервер не отвечает, то ваше приложение просто зависнет в ожидании ответа.Эта проблема полностью описана в этой статье Не использовать стандартный HTTP-клиент Go (в работе) .Хотя вы создаете собственный клиент, вам все равно нужно указать время ожидания.

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