如何在golang中将http请求发送到我自己的服务器

时间:2019-02-26 19:54:36

标签: http web go post server

我正在用golang编写一个简单的Web服务器,以获取/创建/编辑/删除一个简单的文本文件。我已经编写了函数处理程序,我想通过将请求发送到适当的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)
}

一旦运行此代码,就不会创建新文件。我一直在使用Google搜索,但是在这种类型的问题上我什么都找不到,我正在向正在同一文件中构建的服务器发送请求。帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

未执行客户端代码。呼叫http.ListenAndServe(":8080", r)运行服务器。该函数仅在运行服务器时出错时返回。如果函数确实返回,则log.Fatal将退出该过程。

一种解决方法是在goroutine中运行服务器。这将允许主goroutine继续执行至客户端代码。

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

这可能无法解决问题,因为无法保证服务器会在客户端发出请求之前运行。通过在主函数中创建侦听套接字并在goroutine中运行服务器来解决此问题。

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。文档中的示例显示了如何使用测试服务器。