GO语言goWeb学习笔记之Http协议与goWeb简洁

HTTP协议

HTTP超文本传输协议 (HTTP-Hypertexttransferprotocol),是一个属于应用层的
面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统

它详细规定了浏览器和万维网服务器之间互相的通信规则

报文
客户端和服务器端通信时传输的内容
请求报文
客户端发送给服务器端
响应报文
服务器端发送给客户端

浏览器和服务器之间的通信过程

建立连接
发出请求信息
回送响应信息
关闭连接

浏览器与 WEB 服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一
个页面的访问,浏览器与 WEB 服务器都要建立一次单独的连接。
 浏览器到 WEB 服务器之间的所有通讯都是完全独立分开的请求和响应对。

新版本的http协议允许一次拿到所有的资源内容

报文的格式
报文首部 :服务器端或客户端需处理的请求或响应的内容及属性
空行
报文主体 :应被发送的数据

请求报文
请求行
请求头
空行
请求体

Get请求没有请求体 Post请求才有请求体

响应报文
响应行
响应头
空行
响应体

响应状态码
1XX提示信息 - 表示请求已被成功接收,继续处理
2XX成功 - 表示请求已被成功接收,理解,接受
3XX重定向 - 要完成请求必须进行更进一步的处理
4XX客户端错误 - 请求有语法错误或请求无法实现
5XX服务器端错误 - 服务器未能实现合法的请求

常见的状态响应码
200:请求成功,浏览器会把响应体内容(通常是 html)显示在浏览器中;
404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
500:请求资源找到了,但服务器内部出现了错误;
302:重定向,当响应码为 302 时,表示服务器要求浏览器重新再发一个请求,
服务器会发送一个响应头 Location,它指定了新请求的 URL 地址;
GoWeb

1.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!
/hello

1.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函数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值