Http 在golang如何启动web服务器在浏览器中打开页面?

Http 在golang如何启动web服务器在浏览器中打开页面?,http,browser,go,server,Http,Browser,Go,Server,如何使用golang在浏览器中临时打开网页 下面是如何使用python完成的。这是一个相当普遍的问题。您可以使用xdg open程序为您执行此操作。只需从Go开始运行流程。xdgopen将自行分叉,因此我们只需使用Run并等待进程结束 package main import "os/exec" func main() { exec.Command("xdg-open", "http://example.com/").Run() } 您的问题有点误导,因为它询问如何在web浏览器中打

如何使用golang在浏览器中临时打开网页


下面是如何使用python完成的。

这是一个相当普遍的问题。您可以使用
xdg open
程序为您执行此操作。只需从Go开始运行流程。
xdgopen
将自行分叉,因此我们只需使用
Run
并等待进程结束

package main

import "os/exec"

func main() {
    exec.Command("xdg-open", "http://example.com/").Run()
}

您的问题有点误导,因为它询问如何在web浏览器中打开本地页面,但实际上您想知道如何启动web服务器以便在浏览器中打开它

对于后者(启动web服务器以提供静态文件),可以使用该函数。有关更详细的答案,请参阅:和

/tmp/data
文件夹提供服务的示例:

http.Handle("/", http.FileServer(http.Dir("/tmp/data")))
panic(http.ListenAndServe(":8080", nil))
如果您想提供动态内容(由Go代码生成),您可以使用该包并编写自己的处理程序来生成响应,例如:

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标准库中没有内置支持。但这并不难,你只需要执行一个特定于操作系统的外部命令。您可以使用此跨平台解决方案(我也在我的库中发布了此解决方案,请参阅):

此示例代码取自(GoWebUI工具包;披露:我是作者)

请注意,如果需要,将执行操作系统特定的参数引用。因此,例如,如果URL包含
&
,它将在Linux上正确转义,但是,它可能无法在Windows上工作。在Windows上,您可能需要自己手动引用它,例如,用
“^&”替换
&
符号,调用类似
strings.ReplaceAll(url,&“,“^&”)的调用

使用此选项在默认浏览器中打开以前启动的Web服务器:

open("http://localhost:8080/")
最后要注意的一点是:阻塞并且永远不会返回(如果没有错误)。因此,您必须在另一个goroutine中启动服务器或浏览器,例如:

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

查看此问题以了解其他备选方案如何在Web服务器启动后启动浏览器:

上次我这样做时,我在启动浏览器之前添加了一个短暂的延迟,以确保服务器在浏览器发送第一个请求之前有时间侦听。在我的Linux系统上,xdg的配置不太正确,我没有修复xdg的配置,而是用“firefox”而不是“xdg open”硬连线。在与web服务器相同的机器上启动浏览器是开发中的一件好事。但在部署中,web服务器可能运行在无头远程系统上,只需将初始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))
}
主程序包
进口(
“fmt”
“net/http”
“时间”
)
func myHandler(w http.ResponseWriter,r*http.Request){
fmt.Fprint(w,“Go的你好”)
}
func main(){
http.HandleFunc(“/”,myHandler)
go func(){

根据Paul的回答,这里有一个适用于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))
}
主程序包
进口(
“日志”
“net/http”
“os/exec”
“时间”
)
func main(){
http.HandleFunc(“/”,myHandler)
go func(){

您好。您提供的代码有许多语法错误,包括未导入“net/http”、导入“os/exec”但未使用它以及调用未定义的“open”。请编辑您的代码(并测试它)来帮助回答这个问题。谢谢。也许url参数的ParseRequestURI验证不会有什么害处。你永远不知道代码是如何在野外复制和粘贴的。解释了在服务器开始侦听后如何启动浏览器。没有任何轮询。如果我想关闭由
xdg open
打开的选项卡呢?@Rotimi这是不可能的。
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))
}