Golang10-GO语言web服务器

770 阅读4分钟

启动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文件了。

http.PNG

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)
}

http1.PNG

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方式传递参数

常见的获取方式如下:

  1. r.ParseForm()返回error,判断是否解析传参时错误!
  2. r.Form属性,返回url.Values,它是map[string][]string类型。一般情况下,使用r.FormValue(key)方法更简洁方便
  3. r.FormValue(key)方法可以根据客户端传参的key获取对应的值。
  4. 其中r表示*http.Request类型,w表示http.ResponseWriter类型。
1、获取GET方式传递的参数,核心代码如下所示
2、获取POST方式传递的参数
  1. 普通post表单请求:Context-Type=application/x-www-form-urlencoded
  2. 有文件上传的表单: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这块先跳过