Как временно открыть веб-страницу в браузере с помощью golang?

Вот как это делается с помощью HTTPServer в питон.

14
Ciasto piekarz 4 Сен 2016 в 21:49

4 ответа

Лучший ответ

Ваш вопрос немного вводит в заблуждение, поскольку он спрашивает, как открыть локальную страницу в веб-браузере, но на самом деле вы хотите знать, как запустить веб-сервер, чтобы его можно было открыть в браузере.

Для последнего (запуск веб-сервера для обслуживания статических файлов) вы можете использовать {{X0 }} функция. Ответы, в которых он представлен более подробно, см .: Включить файл js в шаблон Go и С веб-сервером golang, где корень веб-сайта сопоставляется с файловой системой & gt;.

Пример обслуживания вашей папки /tmp/data:

http.Handle("/", http.FileServer(http.Dir("/tmp/data")))
panic(http.ListenAndServe(":8080", nil))

Если вы хотите обслуживать динамический контент (сгенерированный кодом Go), вы можете использовать net/http package и напишите свой собственный обработчик, генерирующий ответ, например:

func myHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello from Go")
}

func main() {
    http.HandleFunc("/", myHandler)
    panic(http.ListenAndServe(":8080", nil))
}

Что касается первого (открыть страницу в браузере по умолчанию), то в стандартной библиотеке Go нет встроенной поддержки. Но это не так уж и сложно, вам просто нужно выполнить внешнюю команду, специфичную для ОС. Вы можете использовать это кроссплатформенное решение (которое я также выпустил в своей библиотеке github.com/icza/gox, см. osx.OpenDefault()):

// open opens the specified URL in the default browser of the user.
func open(url string) error {
    var cmd string
    var args []string

    switch runtime.GOOS {
    case "windows":
        cmd = "cmd"
        args = []string{"/c", "start"}
    case "darwin":
        cmd = "open"
    default: // "linux", "freebsd", "openbsd", "netbsd"
        cmd = "xdg-open"
    }
    args = append(args, url)
    return exec.Command(cmd, args...).Start()
}

Этот пример кода взят из Gowut (который является Go Web UI Toolkit; раскрытие: я автор) .

Используя это, чтобы открыть ранее запущенный веб-сервер в браузере по умолчанию:

open("http://localhost:8080/")

И последнее, на что следует обратить внимание: http.ListenAndServe() блокируется и никогда не возвращается (если есть нет ошибки). Поэтому вам нужно запустить сервер или браузер в другой горутине, например:

go open("http://localhost:8080/")
panic(http.ListenAndServe(":8080", nil))

Ознакомьтесь с этим вопросом, чтобы узнать о других альтернативных способах запуска браузера после запуска веб-сервера: Перейти: Как запустить браузер ПОСЛЕ того, как сервер начал прослушивание?

32
icza 15 Янв 2020 в 10:57

Это довольно общая проблема. Вы можете использовать программу xdg-open, чтобы сделать это за вас. Просто запустите процесс из Go. xdg-open будет разветвлен сам по себе, поэтому мы можем просто использовать Run и дождаться окончания процесса.

package main

import "os/exec"

func main() {
    exec.Command("xdg-open", "http://example.com/").Run()
}
1
Grzegorz Żur 4 Сен 2016 в 19:43

В прошлый раз, когда я сделал что-то подобное, я добавил небольшую задержку перед запуском браузера, чтобы убедиться, что сервер успевает прослушать, прежде чем браузер отправит первый запрос. В моей системе Linux xdg был настроен не совсем правильно, и вместо того, чтобы исправлять конфигурацию xdg, я просто установил его с помощью «firefox», а не «xdg-open». Запуск браузера на том же компьютере, что и веб-сервер, был хорошим подспорьем в разработке. Но при развертывании веб-сервер, вероятно, будет работать в удаленной системе без головы, и может иметь смысл просто распечатать исходный URL-адрес на консоли для копирования и вставки из сеанса терминала на удаленный сервер в локальный браузер.

package main

import (
    "fmt"
    "net/http"
    "time"
)

func myHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello from Go")
}

func main() {
    http.HandleFunc("/", myHandler)
    go func() {
        <-time.After(100 * time.Millisecond)
        open("http://localhost:8080/")
    }()
    panic(http.ListenAndServe(":8080", nil))
}
-2
Tom Jowitt 8 Дек 2017 в 05:31

Основываясь на ответе Пола, вот решение, которое работает в Windows:

package main

import (
    "log"
    "net/http"
    "os/exec"
    "time"
)


func main() {
    http.HandleFunc("/", myHandler)
    go func() {
        <-time.After(100 * time.Millisecond)
        err := exec.Command("explorer", "http://127.0.0.1:8080").Run()
        if err != nil {
            log.Println(err)
        }
    }()

    log.Println("running at port localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}
0
Sebastian 5 Апр 2018 в 14:49