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

时间:2016-09-04 18:49:26

标签: http browser go server

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

就像这里是如何使用HTTPServer in python完成的。

4 个答案:

答案 0 :(得分:23)

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

对于后者(启动Web服务器以提供静态文件),您可以使用http.FileServer()功能。有关更详细介绍的答案,请参阅:Include js file in Go templateWith golang webserver where does the root of the website map onto the filesystem>

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

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

如果您想提供动态内容(由Go代码生成),您可以使用net/http包并编写自己的处理程序来生成响应,例如:

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标准库中没有内置支持。但它并不难,您只需要执行特定于操作系统的外部命令。您可以使用此跨平台解决方案:

// 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()阻止并且永不返回(如果没有错误)。因此,您必须在另一个goroutine中启动服务器或浏览器,例如:

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

在网络服务器启动后,查看此问题以了解其他替代方法如何启动浏览器:Go: How can I start the browser AFTER the server started listening?

答案 1 :(得分:0)

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

package main

import "os/exec"

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

答案 2 :(得分:0)

基于Paul的答案,这是一个适用于Windows的解决方案:

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    final PostViewHolder holder1 = (PostViewHolder) holder;
    holder1.postID = getPostId(position)

    //...
}

//...

public class PostViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    private DatabaseReference mNoOfLikesRef;
    public String postID;
    //...

    public PostViewHolder(View itemView, postClickListener listener){
        super(itemView);

        //This line causes the NullPointerException on postID
        mNoOfLikesRef = FirebaseDatabase.getInstance().getReference().child("likes").child(postID);
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //...
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }

        };
        mNoOfLikesRef.addListenerForSingleValueEvent(valueEventListener);

    }

答案 3 :(得分:-2)

上次我做了类似的事情,我在启动浏览器之前添加了一个短暂的延迟,以确保服务器有时间在浏览器发送第一个请求之前进行监听。在我的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))
}