package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "index.html") }) http.HandleFunc("/chat", func(w http.ResponseWriter, r *http.Request) { message := r.PostFormValue("message") fmt.Println("Received message:", message) }) log.Fatal(http.ListenAndServe(":8080", nil)) }
时间: 2023-07-19 19:57:42 浏览: 36
这是一个使用 Golang 编写的简单的 HTTP 服务器,主要实现了两个路由:
1. "/" 路由:用来处理 HTTP GET 请求,返回一个名为 "index.html" 的文件。
2. "/chat" 路由:用来处理 HTTP POST 请求,从请求中获取 "message" 参数,并在控制台中打印出来。
该程序的主要流程如下:
1. 引入必要的包。
2. 定义两个路由处理函数,分别用于处理 "/" 和 "/chat" 两个路由。
3. 在主函数中,注册路由处理函数,并启动 HTTP 服务器监听端口号为 8080 的请求。
4. 在程序中使用 log.Fatal() 函数来处理错误,如果程序启动失败,将会输出相应的错误信息并退出程序。
相关问题
package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, world!") } func main() { mux := http.NewServeMux() mux.HandleFunc("/", handler) go func() { err := http.ListenAndServe(":8080", mux) if err != nil { log.Fatal(err) } }() go func() { err := http.ListenAndServe(":8081", mux) if err != nil { log.Fatal(err) } }() select {} }怎么用一个http请求结束这段代码
你可以使用 context 包来实现这个目的。具体实现可以参考以下代码:
```
package main
import (
"context"
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, world!")
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", handler)
srv := &http.Server{Addr: ":8080", Handler: mux}
go func() {
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %v", err)
}
}()
ctx := context.Background()
// 等待一个 http 请求
<-ctx.Done()
// 关闭服务器
if err := srv.Shutdown(context.Background()); err != nil {
log.Fatalf("Shutdown(): %v", err)
}
}
```
这个程序会启动一个 HTTP 服务器,监听 8080 端口。当程序收到一个 http 请求时,会关闭服务器并退出程序。
package main import ( "fmt" "html/template" "log" "net/http" "strings" ) func login(w http.ResponseWriter, r *http.Request) { fmt.Println("method:", r.Method) if r.Method == "GET" { t, err := template.ParseFiles("H:\\Goproject\\src\\web\\login.html") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if err := t.Execute(w, nil); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } else { _ = r.ParseForm() fmt.Println("username:", r.Form["username"]) fmt.Println("password:", r.Form["password"]) if pwd := r.Form.Get("password"); pwd == "123456" { fmt.Fprintf(w, "欢迎登陆,Hello %s!", r.Form.Get("username")) } else { fmt.Fprintf(w, "密码错误!") } } } func sayHello(w http.ResponseWriter, r *http.Request) { _ = r.ParseForm() //3 解析参数,默认不解析 fmt.Println(r.Form) //4 输出到服务器端的打印信息 fmt.Println("Path:", r.URL.Path) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("value", strings.Join(v, "")) } fmt.Fprintf(w, "Hello aoho") //5 写入到w的是输出到客户端的内容 } func main() { http.HandleFunc("/", login) http.HandleFunc("/sayHello", sayHello) //1 设置访问的路由 err := http.ListenAndServe(":8080", nil) //2 设置监听的端口 if err != nil { log.Fatal("ListenSever:", err) } } 修改为绝对路径可以运行,但是如何修改为相对路径
要将路径修改为相对路径,您需要使用`http.Dir`函数将文件夹路径转换为`http.FileServer`类型。这样可以指定要提供给用户的静态文件所在的文件夹。以下是对代码的修改:
```go
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"strings"
)
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method)
if r.Method == "GET" {
t, err := template.ParseFiles("login.html")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err := t.Execute(w, nil); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
} else {
_ = r.ParseForm()
fmt.Println("username:", r.Form["username"])
fmt.Println("password:", r.Form["password"])
if pwd := r.Form.Get("password"); pwd == "123456" {
fmt.Fprintf(w, "欢迎登陆,Hello %s!", r.Form.Get("username"))
} else {
fmt.Fprintf(w, "密码错误!")
}
}
}
func sayHello(w http.ResponseWriter, r *http.Request) {
_ = r.ParseForm() //3 解析参数,默认不解析
fmt.Println(r.Form) //4 输出到服务器端的打印信息
fmt.Println("Path:", r.URL.Path)
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("value", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello aoho") //5 写入到w的是输出到客户端的内容
}
func main() {
http.HandleFunc("/", login)
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.HandleFunc("/sayHello", sayHello) //1 设置访问的路由
err := http.ListenAndServe(":8080", nil) //2 设置监听的端口
if err != nil {
log.Fatal("ListenSever:", err)
}
}
```
这里假设您的静态资源文件夹名为`static`,并且在同一级目录下。使用`http.Handle`和`http.StripPrefix`函数来处理静态文件路由,并指定静态文件夹的相对路径。修改后,您应该能够使用相对路径来访问静态文件。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)