启动web服务器的几种方式
1、使用http.FileServer()方法
http.FileServer()搭建的服务器只提供静态文件的访问。因为这种web服务只支持静态文件访问,所以称之为静态文件服务。
http.ListenAndServer()函数用来启动Web服务,绑定并监听http端口。其中第一个参数为监听地址,第二个参数表示提供文件访问服务器的HTTP处理器Handler
Handler是一个接口,其中只有ServeHTTP(http.ResponseWriter,*http.Request)这个方法,只要实现该方法,那么就自动实现了Handler接口
package main
import "net/http"
func testFileServer() {
//如果该路径里面有index.html文件,会优先显示html文件,否则会看到文件目录
http.ListenAndServe(":2003",http.FileServer(http.Dir("./")))
}
func main() {
testFileServer()
}
在当前目录下创建一个index.html文件,里面写一个h1标签,然后通过http.ListenAndServe(":2003",http.FileServer(http.Dir("./")))就可以自动监听到index.html文件了。
2、使用http.HandleFunc()方法
http.HandleFunc()方法的作用是注册网络访问的路由。因为它采用的是默认的路由分发任务方式,称之为默认的多路由分发服务。
HandleFunc()的第一个参数是请求路径的匹配模式,第二个参数是一个函数类型,表示这个请求需要处理的事情。 HandleFunc()是一个典型的函数式编程的例子,而函数式编程也是Go语言的神奇之处。
http.HandleFunc(pattern string,handler func(ResponseWriter,*Request))
//这段代码具体是啥意思我也不太懂。非科班计算机网络和操作系统得多补补
Sample多路由服务
package main
import (
"fmt"
"net/http"
)
func indexHandler(w http.ResponseWriter,r *http.Request) {
fmt.Println("/index================")
w.Write([]byte("这是默认首页"))
}
func main() {
//绑定路径,去触发方法
http.HandleFunc("/index",indexHandler)
//绑定端口
//第一个参数为监听地址,第二个参数表示服务器端处理程序,通常为Nil,这意味着服务端调用http.DefaultServeMux进行处理
err:=http.ListenAndServe("localhost:3333",nil)
fmt.Println(err)
}
3、使用http.NewServeMux()方法
http.NewServeMux()的作用是注册网络访问的多路路由。因为它采用的是自定义的多路由分发任务方式,所以称之为自定义多路由分发服务。
Mux是Multiplexer的缩写,意思是多路由转换器(多路路由器)
ServeMux结构体有一个map属性,这是一个路由集合。该map中的一个key是string,而value是一个muxEntry。muxEntry是路由的具体条目。又包括请求路径和路由的处理逻辑。即Handler接口。具体定义如下:
package main
import (
"net/http"
"sync"
)
type serMux struct{
mu sync.RWMutex
m map[string] muxEntry
hosts bool //
}
type muxEntry struct{
explicigt bool
h http.Handler
pattern string
}
http.HandlerFunc()其实是在调用DefaultServeMux.HandleFunc()。两个HandleFunc()虽然名字完全一样,但一个是http包中的函数,一个是DefaultServeMux对象中的方法。
这部分可以自行网上查阅相关的代码案例
服务器获取客户端请求的数据
1、获取GET方式传递参数
常见的获取方式如下:
- r.ParseForm()返回error,判断是否解析传参时错误!
- r.Form属性,返回url.Values,它是map[string][]string类型。一般情况下,使用r.FormValue(key)方法更简洁方便
- r.FormValue(key)方法可以根据客户端传参的key获取对应的值。
- 其中r表示*http.Request类型,w表示http.ResponseWriter类型。
1、获取GET方式传递的参数,核心代码如下所示
2、获取POST方式传递的参数
- 普通post表单请求:Context-Type=application/x-www-form-urlencoded
- 有文件上传的表单:Content-Type=multipart/form-data
有文件上传的表单:Content-Type=multipart/form-data
3、获取Cookie中的数值
Cookie是一个结构体,其中有Cookie的名和值,domain,过期时间等信息。具体定义方式如下所示
Cookie的具体定义方式
可以通过http.SetCookie()函数来设置Cookie,通过r.Cookie()方法获取Cookie。核心代码如下所示
Golang模板(暂时跳过)
模板的概念就是在写动态页面时不变的部分。服务器端程序渲染可变部分生成动态网页,Go语言提供了html/template包来支持模板渲染。Go提供的html/template包对HTML提供了丰富的模板语言,主要用于Web应用程序
1、变量
Golang渲染template的时候,可以在模板文件中读取变量内的值,并渲染道模板里面。
type User struct {
userID int
userName string
age uint
sex string
}
2、内置模板函数
JSON编码
map转JSON
Sample将map转为JSON
package main
import (
"encoding/json"
"fmt"
)
func main() {
//定义一个map变量并初始化
n:=map[string][]string{
"level":{"debug"},
"message":{"file not found","stack overflow"},
}
//將map解析成JSON格式
if data,err:=json.Marshal(n);err==nil{
fmt.Printf("%s\n",data)
}
}
/*
{"level":["debug"],"message":["file not found","stack overflow"]}
*/
return 的JSON格式不方便于閲讀,这里采用json.marshallndent(),该函数有两个参数表示每一行的前缀和缩进方式。
package main
import (
"encoding/json"
"fmt"
)
func main() {
//定义一个map变量并初始化
n:=map[string][]string{
"level":{"debug"},
"message":{"file not found","stack overflow"},
}
//將map解析成JSON格式
if data,err:=json.MarshalIndent(n,""," ");err==nil{
fmt.Printf("%s\n",data)
}
}
/*返回
{
"level": [
"debug"
],
"message": [
"file not found",
"stack overflow"
]
}
*/
json包会把Go的类型转换为JSON类型
结构体转JSON
结构体转成JSON在开发中经常会用到。json包是通过反射机制来实现编解码的,因此结构体必须导出所转换的字段,没有导出的字段不会被json包解析。
JSON这块先跳过