Go web与Content-Type
首先要对http的工作方式有一定的了解,这里默认大家都会。这里只是随手写了点东西记录一下Content-Type的类型和内容。
http请求与响应
http request的具体组成
- 请求行:请求类型+url+协议版本
- 请求头:Host(表明请求目的地 主机域名) User-Agent(客户端的信息 由浏览器定义) Content-Type Content-Length等等
- 空行
- 请求体:实体数据
http response的具体组成
- 状态行:由协议版本号、状态码和状态消息组成
- 响应头: 客户端可以使用的一些信息 比如Date Content-Type Connection(是否为长链接) 等等
- 空行
- 响应体:实体数据
net/http
这个库里面主要是与http相关的一些API,可以分为客户端和服务端两个部分
- 服务端相关:server serverMux Handler/HandlerFunc
- 客户端相关: client response header request cookie
具体过程如下
首先服务端创建Listen Socket监听指定的端口,等待客户端请求到来,之后Listen socket接受客户端的请求,得到Client Socket,通过这个socket和客户端进行通信;每次处理客户端的请求时,首先从Client Socket读取HTTP协议头,如果是POST可能还要读取数据,然后交给相应的Handler处理,处理完毕之后准备好客户端需要的数据,通过Client Socket写回给客户端。
ListenAndServe函数的具体流程
- 监听某个端口 如果有新连接进来 创建一个goroutine处理新的连接
- 在goroutine中 将请求和响应分别封装为http.Request和http.ResponseWriter对象,将这两个对象作为参数传递给server.Handler的serveHTTP,这个server.handler就是listenandserve函数的参数(http.servemux)
- 查找http.Request对象的url(在servemux中的map中进行) 然后执行
- 监听之后内部有一个for循环不断接受请求,每个请求创建一个conn,最后创建一个goroutine
Content-Type初识
Content-Type 是http的首部字段,用于说明请求或者返回的消息body是以何种方式进行编码,在request header和response header里都存在,网页通过这个类型定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
常见的媒体格式类型如下
- text/html html格式
- text/plain 纯文本格式
- text/xml xml格式
- text/gif gif图片格式
- text/jpeg jpg图片格式
- text/png png图片格式
以application开头的媒体格式类型
- application/xhtml+xml XHTML格式
- application/xml XML格式
- application/atom+xml Atom XML聚合格式
- application/json JSON数据格式
- application/pdf pdf格式
- application/msword Word文档格式
- application/octet-stream 二进制数据流格式
- application/x-www-form-unlencoded 表单默认的提交数据格式(被编码为key/value的格式)
另一种常见的媒体格式的上传文件之时使用的
- multipart/form-data 需要在表单中进行文件上传时,就需要使用到这个格式