HTTP1.0的4个基本元素
HTTP的4个基本元素分别是
- 方法和路径
- 首部
- 主体
- 状态码
这里简要总结《详解HTTP》中的内容。首先利用Go语言简要实现一个显示hello的echo 服务器。
package main
import (
"fmt"
"log"
"net/http"
"net/http/httputil"
)
func handler(w http.ResponseWriter, r *http.Request) {
dump, err := httputil.DumpRequest(r, true)
if err != nil {
http.Error(w, fmt.Sprint(err), http.StatusInternalServerError)
return
}
fmt.Println(string(dump))
fmt.Fprintf(w, "<html><boyd>hello</body></html>\n")
}
func main() {
var httpServer http.Server
http.HandleFunc("/", handler)
log.Println("start http listening:18888")
httpServer.Addr = ":18888"
log.Println(httpServer.ListenAndServe())
}
这里我们直接go run server.go
即可在终端中运行。如果成功,我们可以在终端看到日期+时间+start http listening:1888
的字样。在浏览器中输入localhost:1888
,我们应该也可以看到hello字样了。
curl的简单使用
curL默认最低支持HTTP1.0(记得curl默认只能在cmd中运行)。在HTTP0.9中,协议只支持向服务器请求网站的页面,并接收网站的内容作为响应,接收完毕就自动切断连接。0.9中的表单查询功能一直延续至今。请求端在地址末尾用“?”词语(“+”隔开)来发送请求。我们可以利用curl中的--data-urlencode
来自动在地址加上内容。比如curl --http1.0 -G --data-urlencode "search hello" http://localhost:18888
。我们可以看到:
方法
方法表示服务器对指定地址中的资源进行操作。最早来源于新闻组的需求,延续到HTTP协议中。
比较常用的有:
- GET: 向服务器请求首部和内容
- HEAD: 只向服务器请求首部
- POST: 投递新的文档
- PUT: 更新已经存在的URL的文档
- DELETE: 删除指定的URL的文档
首部
首部最早在电子邮件服务中出现,格式一般是“字段名:值”。在curl中,可以通过--header=/-H
来更改或添加首部。各个程序可以添加X-
格式的首部,不过现在趋势就是尽可能使用本来RFC定义的首部。比如我们可以手动更改User-Agent
的信息(-A
):curl -v --http1.0 -G -A "Mozilla/5.0" http://localhost:18888
:
这样看就仿佛是火狐浏览器发了一个GET请求。这里的-v
可以让我们在客户端看到详细日志,包括服务器的信息。
这里的Content-Type
表示MIME类型字符串。
状态码
上图中的200 OK
就是状态码。
- 1字头表示正在处理的信息
- 2字头表示成功时的响应
- 3字头表示服务器给客户端的响应
- 4字头表示客户端发送异常请求
- 5字头表示服务器发生内部错误
其中3字头有部分是指示浏览器进行重定向到别的路径的。浏览器会根据状态码决定是临时重定向还是永久重定向,根据location
首部决定重定向的路径。
主体
主体和首部隔一行。在curl中可以通过-d / --data / --data-ascii
来发送编码后的文本数据,比如我们试图发送一个简单的JSON文件curl -d "{\hello\": \"world\"}" -H "Content-Type application/json" http://localhost:18888
。我们自然会在服务器看到{\hello": "world"}
的表示。