HTTP1-0的4个元素

发布时间 2023-07-01 19:51:17作者: WYFC4

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。我们可以看到:
xv6UDH.png

方法

方法表示服务器对指定地址中的资源进行操作。最早来源于新闻组的需求,延续到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
xvgMfx.png

这样看就仿佛是火狐浏览器发了一个GET请求。这里的-v可以让我们在客户端看到详细日志,包括服务器的信息。
xvgrjS.png

这里的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"}的表示。