Http 在golang如何启动web服务器在浏览器中打开页面?
如何使用golang在浏览器中临时打开网页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浏览器中打
下面是如何使用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))
}