我正在用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搜索,但是在这种类型的问题上我什么都找不到,我正在向正在同一文件中构建的服务器发送请求。帮助表示赞赏。
答案 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。文档中的示例显示了如何使用测试服务器。