61 Star 341 Fork 415

infraboard / go-course

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
http.md 4.81 KB
一键复制 编辑 原始数据 按行查看 历史
Mr.Yu 提交于 2021-08-29 17:44 . demo

HTTP 协议

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本–HTTP 1.1

下图是HTTP协议格式:

协议交互

请求报文

HTTP的请求分为:请求行、请求头和请求体。

请求方法

方法 描述
GET 请求指定的页面信息,并返回实体主体
HEAD 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改
PUT 从客户端向服务器传送的数据取代指定的文档的内容
DELETE 请求服务器删除指定的页面
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能
TRACE 回显服务器收到的请求,主要用于测试或诊断。

统一资源定位符: URI

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名

protocol :// hostname[:port] / path / [?parameters]#fragment

比如: https://baijiahao.baidu.com/s?id=1603848351636567407&wfr=spider&for=pc

  • protocol:https
  • hostname:baijiahao.baidu.com
  • parameters:id=1603848351636567407&wfr=spider&for=pc (使用&分割参数)

协议版本

  • HTTP1.1
  • HTTP2
  • HTTP3

请求头

  • Accept:指定客户端能够接收的内容类型
  • Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型
  • Accept-Language:浏览器可接受的语言
  • Content-Length:请求的内容的长度,如:Content-Lenght:348
  • Content-Type:请求的与实体对应的MIME信息,常用的类型如下:
    • text/html:HTML格式
    • text/plain:纯文本格式
    • text/xml:XML格式
    • image/gif:gif图片格式
    • image/jpeg:jpg图片格式
    • image/png:png图片格式
    • application/xhtml+xml:XHTML格式
    • application/xml:XML数据格式
    • application/json:JSON数据格式
    • application/pdf:pdf格式
    • application/msword:word文档格式
    • application/octet-stream:二进制流数据
  • Date请求发送的日期和时间

更多的请求头字段参考:HTTP响应头和请求头信息对照表

请求体

在整个报文中,请求头之后,隔一行空格,以下部分就是HTTP的请求体了。请求体是我们发送请求的时候需要传给接收端的内容。其格式需要和请求头中的Content-Type对应,不然会导致接受无法识别

响应报文

HTTP的响应同样分为:响应行、响应头和响应体。和请求报文有点类似

状态码

响应行中包含了HTTP的版本和本次请求的状态,状态码见HTTP Status Code

响应头

响应头用于描述服务器的基本信息、数据的描述,这些信息将告知客户端如何处理响应头中的内容。

  • Allow 服务器支持哪些请求方法(如GET、POST等)。
  • Content-Encoding 文档的编码(Encode)方法。只有在解码之后才能得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
  • Content-Lenght 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
  • Content-Type 表示后面的文档属于什么MIME类型。更多的请求头字段参考:HTTP响应头和请求头信息对照表

响应实体

响应实体中包含的就是客户端从服务器中获取的数据了。数据的格式和长度都会在响应体中描述

实战验证

基于标准库写个简单的http 接口服务

package main

import (
	"fmt"
	"net/http"
)

func IndexHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "hello, world")
}

func main() {
	http.HandleFunc("/", IndexHandler)
	http.ListenAndServe(":8080", nil)
}

启动后使用telent来进行验证

$telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
HOST:localhost

HTTP/1.1 200 OK
Date: Sun, 29 Aug 2021 05:58:49 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8

hello, world

参考

Go
1
https://gitee.com/infraboard/go-course.git
git@gitee.com:infraboard/go-course.git
infraboard
go-course
go-course
master

搜索帮助