本文共 4271 字,大约阅读时间需要 14 分钟。
HTTP协议
HTTP超文本传输协议 (HTTP-Hypertexttransferprotocol),是一个属于应用层的
面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统它详细规定了浏览器和万维网服务器之间互相的通信规则
报文
客户端和服务器端通信时传输的内容 请求报文 客户端发送给服务器端 响应报文 服务器端发送给客户端浏览器和服务器之间的通信过程
建立连接
发出请求信息 回送响应信息 关闭连接浏览器与 WEB 服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一
个页面的访问,浏览器与 WEB 服务器都要建立一次单独的连接。 浏览器到 WEB 服务器之间的所有通讯都是完全独立分开的请求和响应对。新版本的http协议允许一次拿到所有的资源内容
报文的格式
报文首部 :服务器端或客户端需处理的请求或响应的内容及属性 空行 报文主体 :应被发送的数据请求报文
请求行 请求头 空行 请求体Get请求没有请求体 Post请求才有请求体
响应报文
响应行 响应头 空行 响应体响应状态码
1XX提示信息 - 表示请求已被成功接收,继续处理 2XX成功 - 表示请求已被成功接收,理解,接受 3XX重定向 - 要完成请求必须进行更进一步的处理 4XX客户端错误 - 请求有语法错误或请求无法实现 5XX服务器端错误 - 服务器未能实现合法的请求常见的状态响应码
200:请求成功,浏览器会把响应体内容(通常是 html)显示在浏览器中; 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源; 500:请求资源找到了,但服务器内部出现了错误; 302:重定向,当响应码为 302 时,表示服务器要求浏览器重新再发一个请求, 服务器会发送一个响应头 Location,它指定了新请求的 URL 地址; GoWeb1.1 Web 应用简介
Web 应用在我们的生活中无处不在。看看我们日常使用的各个应用程序,它们要 么是 Web 应用,要么是移动 App 这类 Web 应用的变种。无论哪一种编程语言,只要 它能够开发出与人类交互的软件,它就必然会支持 Web 应用开发。对一门崭新的编程 语言来说,它的开发者首先要做的一件事,就是构建与互联网( Internet)和万维网( World Wide Web)交互的库( library)和框架,而那些更为成熟的编程语言还会有各种五花八门 的 Web 开发工具。 Go 是一门刚开始崭露头角的语言,它是为了让人们能够简单而高效地编写后端系 统而创建的。这门语言拥有众多的先进特性,如函数式编程方面的特性、内置了对并发 编程的支持、现代化的包管理系统、垃圾收集特性、以及一些包罗万象威力强大的标准 库,而且如果需要我们还可以引入第三方开源库1.2在终端执行以下命令(使用 Vscode 开发工具时):
a) 方式一(建议使用):在 webapp 目录中右键→在命令提示符中打开
执行 go build main.go 命令;然后在当前目录中就会生成一个 main.exe 的 二进制可执行文件;最后再执行 ./main.exe 就可以启动服务器 b) 方式二:在 webapp 目录中右键→在命令提示符中打开 执行 go install webapp 命令;然后在 bin 目录中会生成一个 webapp.exe 的二进制可执行文件;进入 bin 目录之后再 bin 目录中执行 ./webapp.exe 就 可以启动服务器 3) 在浏览器地址栏输入 http://localhost:8080,在浏览器中就会显示 Hello World! / 在浏览器地址栏输入 http://localhost:8080/hello,在浏览器中就会显示 Hello World! /hello1.3区别于java go语言有自己的网络包,只需要调用这些包即可使用
不要再创建动态工程 多路复用器就是多路转接器,它会将每一个接收的请求的URL与一个注册模式的列表进行匹配,并调用和URL最匹配的模式的处理器2.1
通过创建Server的详细的实体来配置服务器的信息type Server type Server struct { Addr string // 监听的TCP地址,如果为空字符串会使用":http" Handler Handler // 调用的处理器,如为nil会调用http.DefaultServeMux ReadTimeout time.Duration // 请求的读取操作在超时前的最大持续时间 WriteTimeout time.Duration // 回复的写入操作在超时前的最大持续时间 MaxHeaderBytes int // 请求的头域最大长度,如为0则用DefaultMaxHeaderBytes TLSConfig *tls.Config // 可选的TLS配置,用于ListenAndServeTLS方法 // TLSNextProto(可选地)指定一个函数来在一个NPN型协议升级出现时接管TLS连接的所有权。 // 映射的键为商谈的协议名;映射的值为函数,该函数的Handler参数应处理HTTP请求, // 并且初始化Handler.ServeHTTP的*Request参数的TLS和RemoteAddr字段(如果未设置)。 // 连接在函数返回时会自动关闭。 TLSNextProto map[string]func(*Server, *tls.Conn, Handler) // ConnState字段指定一个可选的回调函数,该函数会在一个与客户端的连接改变状态时被调用。 // 参见ConnState类型和相关常数获取细节。 ConnState func(net.Conn, ConnState) // ErrorLog指定一个可选的日志记录器,用于记录接收连接时的错误和处理器不正常的行为。 // 如果本字段为nil,日志会通过log包的标准日志记录器写入os.Stderr。 ErrorLog *log.Logger // 内含隐藏或非导出字段 }
Server类型定义了运行HTTP服务端的参数。Server的零值是合法的配置
总结:
1.可以自己写一个处理器,然后调用处理器函数 即 //创建处理器函数func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "正在通过处理器函数处理你的请求")}func main() { http.HandleFunc("/", handler) //调用处理器函数http.ListenAndServe(":8080", nil) //使用http默认的方法}
2.使用Handler接口来实现一个处理器
先实现接口中的方法ServerHTTP()这个方法 通过调用处理器Handle()来实现type MyHandler struct{ }func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "正在通过处理器处理你的请求")}func main() { myHandler := MyHandler{ }//调用处理器http.Handle("/", &myHandler)http.ListenAndServe(":8080", nil)}
该方法还可以通过Server结构体对服务器进行详细的配置
//通过 Server 结构对服务器进行更详细的配置server := http.Server{ Addr: ":8080",Handler: &myHandler,ReadTimeout: 2 * time.Second,}server.ListenAndServe()}
3.使用自己创建的多路复用器
func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "通过自己创建的多路复用器来处理请求")}func main() { mux := http.NewServeMux()mux.HandleFunc("/myMux", handler)http.ListenAndServe(":8080", mux)}type ServeMux type ServeMux struct { // 内含隐藏或非导出字段}
ServeMux类型是HTTP请求的多路转接器。它会将每一个接收的请求的URL与一个注册模式的列表进行匹配,并调用和URL最匹配的模式的处理器。
模式是固定的、由根开始的路径,如"/favicon.ico",或由根开始的子树,如"/images/"(注意结尾的斜杠)。较长的模式优先于较短的模式,因此如果模式"/images/“和”/images/thumbnails/“都注册了处理器,后一个处理器会用于路径以”/images/thumbnails/“开始的请求,前一个处理器会接收到其余的路径在”/images/“子树下的请求。 注意,因为以斜杠结尾的模式代表一个由根开始的子树,模式”/“会匹配所有的未被其他注册的模式匹配的路径,而不仅仅是路径”/"。 模式也能(可选地)以主机名开始,表示只匹配该主机上的路径。指定主机的模式优先于一般的模式,因此一个注册了两个模式"/codesearch"和"codesearch.google.com/"的处理器不会接管目标为"http://www.google.com/“的请求。 ServeMux还会注意到请求的URL路径的无害化,将任何路径中包含”.“或”…"元素的请求重定向到等价的没有这两种元素的URL。(参见path.Clean函数)转载地址:http://tgydi.baihongyu.com/