Как отправить запрос HTTP в Голанге на свой сервер - PullRequest
0 голосов
/ 26 февраля 2019

Я пишу простой веб-сервер на Голанге, который получает / создает / редактирует / удаляет простой текстовый файл.Я написал обработчики функций, и я хотел бы проверить их, отправив запрос на соответствующий URL и проверив, что произойдет.Мой код выглядит следующим образом:

func createHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    name := vars["name"]
    body, _ := ioutil.ReadAll(r.Body)
    fmt.Fprint(w, name)
    ioutil.WriteFile(name, []byte(body), 0644)
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/textFiles/{name}", createHandler).Methods("POST")
    log.Fatal(http.ListenAndServe(":8080", r))

    var url = "http://localhost:8080/textFiles/testFile.txt"
    var text = []byte(`{"title":"this is an example."}`)
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(text))
    if err != nil {
        panic(err)
    }

    client := &http.Client{}
    client.Do(req)
}

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

1 Ответ

0 голосов
/ 26 февраля 2019

Код клиента не выполняется.Вызов http.ListenAndServe(":8080", r) запускает сервер.Функция возвращается только в случае ошибки при запуске сервера.Если функция вернется, то log.Fatal выйдет из процесса.

Одним из исправлений является запуск сервера в программе.Это позволит основной программе продолжить выполнение клиентского кода.

go func() {
    log.Fatal(http.ListenAndServe(":8080", r))
}()

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

ln, err := net.Listen("tcp", ":8080")
if err != nil {
    log.Fatal(err)
}
go func() {
    log.Fatal(http.Serve(ln, r))
}()
... client code as before

Если целью этого кода является тестирование, используйте httptest.Server .В примере из документации показано использование тестового сервера.

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