分享 HTTP 简单介绍

dandananddada · 2015年07月03日 · 最后由 dandananddada 回复于 2015年07月06日 · 3858 次阅读

写在前面

电话面 360,被问到 http 协议,状态码和响应报文,本来前段时间有专门看过,当时想简单整理下,后来因为种种原因不知道为什么就忘记了。 今天突然被问到有点短路,其实 http 本身没什么东西,但是有些基础的东西不整理出来可能再次被问到还会懵掉,所以下午参考了下面一篇文章做了简单的整理。 如果有还不是很清楚的朋友,又懒得翻大篇我教科书介绍,可以简单看看,但愿有所帮助。

参考资料 HTTP 下午茶 HTTP Made Really Easy HTTP Watch

HTTP

http(Hypertext Transfer Protocol) 超文本传输协议是应用于万维网的网络传输协议。

浏览器可以看做是 http 的客户端 (client),它向服务端 (server) 发出请求,服务端会接受请求并响应反馈给客户端。

默认情况下,http servere 是监听 80 端口来处理 http 请求的。

资源

http 用来传输资源,不仅仅是文件。资源是一串可以通过 URL 唯一标识的信息,文件是最常见的资源,资源也可以是动态的查询结果,也可以是 CGI 脚本或者其他内容。

资源可以理解为文件或者服务端反馈的脚本。

http 结构

http 协议采用 c/s(client-server) 方式进行数据的传输,首先客户端会打开一个链接然后向服务端发出一个 http 请求,服务端接受请求后会返回一个响应的信息,通常这个信息包含请求的资源,之后服务端就会关闭链接。

需要注意 http 是一个无状态的协议,也就是服务端不会记录客户端任何的状态信息。

http 中请求和响应的报文格式是类似的,大多数报文都包含如下内容:

  1. initial line

  2. header line

  3. blank line

  4. message body

initial line

请求报文 initial line

请求报文中 initial line 由三部分组成,每部分之间通过空格分隔,分别是请求方法,请求路径以及 http 版本。

GET /path/to/file/index.html HTTP/1.0

响应报文 initial line

响应报文的 initial line 也由三部分组成,每部分之间通过空格分隔,分别是 http 版本,响应状态吗以及状态码描述。

HTTP/1.0 200 OK

状态码说明

状态码 状态码类别 类别说明
1xx informational 服务端接收到请求,但仍在处理中并没有完成
2xx successful 服务器成功处理请求
3xx redirection 请求处理完成,但客户端需要从其他位置获取资源
4xx client error 客户端错误
5xx server error 服务端错误

常见状态码

状态码 状态码描述 说明
200 OK 请求成功
301 Moved Permanently 永久重定向
302 Moved Temporarily 临时重定向
303 See Other 重定向
304 Not Modified 从缓存读取
401 CheckUpDown 未授权
404 Not Found 资源不存在
500 Server Error 服务器错误
503 Service unavailable 服务不可用

header linse

header linse 用来提供关于请求和响应报文的一些描述信息,一般以键值对的方式展现。

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

一些应用需要自定义 header 来添加相关的描述,这个时候需要在 header 的名称前加一个前缀X-

X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319

message body message body 就是客户端请求到的资源数据,在请求报文中这部分就是需要传递到后太的用户输入的数据或文件。

http method

http 方法主要有 get、post、head

get

get 是最常用的 http 方法,可以通过 uri 直接访问资源。

post

post 请求用来向服务端传输数据,post 请求和 get 请求的区别在于:

  1. 通常有额外的 header 用来描述 message body 比如Content-TypeContent-Length

  2. post 请求的 uri 通常是一段处理请求数据的代码,而不是直接访问的静态文件。

  3. post 请求响应的内容通常都是动态输出的,而不是一个静态的文件。

最常用的 post 方法就是提交表单数据到服务器。

head

head 请求和 get 请求类似,不同的是 head 请求只需要服务端返回响应报文中的 header 即可。当你不需要文件内容的时候可以使用 head 方法。

Tealeaf 有一本小书 Introduction to HTTP

#1 楼 @zsjacky 恩。。之前有看过。。我加进去~

那么多 IT 公司,为什么要投 360 呢?

大部分都会问 304。你投的是 PHP?

#6 楼 @dandananddada 360 有招 ruby。。。。。。是纯 ruby 还是 ruby on rails。。。

投 360 就不怕对后面的职业生涯造成影响吗?

#8 楼 @numbcoder 不要慌,随便投的,因为那天刚做完简历,拉钩看搜了 ruby,顺手就投了。。。

#10 楼 @dandananddada 投 Ruby 的简历干嘛要看拉钩呢?RubyChina 的招聘版不如拉钩?

可以直接看 rfc2616

@dandananddada header linse,应该是 lines 吧?

#11 楼 @lgn21st 这边投过了。。。然后又去拉钩看了看,其实拉钩那边顺便看看前端的工作。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号