转载请注明出处 作者:DeveloperHaoz 本文链接:程序员都该懂点HTTP 说明:本文主要是对HTTP基础知识进行总结和归纳,毕竟做IT的,网络这一块还是很重要的
HTTP全称是HyperText Transfer Protocal,即:超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,HTTP是应用层协议,当你上网浏览网页的时候,浏览器和web服务器之间就会通过HTTP在Internet上进行数据的发送和接收。HTTP是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response
URL(Uniform Resource Locator)是统一资源定位符的简称,有时候也被俗称为网页地址(网址),如同是网络上的门牌,是因特网上标准的资源的地址
通用的格式:schema://host[:port#]/path/…/[?query-string][#anchor]
名称功能schema访问服务器以获取资源时要使用哪种协议,比如,http,https和FTP等hostHTTP服务器的IP地址或域名port#HTTP服务器的默认端口是80,这种情况下端口号可以省略,如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080path访问资源的路径query-string发给http服务器的数据anchor锚举个例子: http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff 其中
名称对应的字段Schemahttphostwww.mywebsite.compath/js/test/test.aspxQuery-stringname=sviergn&x=trueanchorstuff再来张比较直观的图
HTTP的请求报文分为三个部分:请求行、请求头、请求体
请求行(Request line)分为三个部分:请求方法、请求地址和协议版本
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同的方式操作指定的资源
方法名功能GET向指定的资源发出“显示”请求,使用GET方法应该只用在读取数据上,而不应该用于产生“副作用”的操作中POST指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或者修改现有资源,或两者皆有。PUT向指定资源位置上传其最新内容DELETE请求服务器删除Request-URI所标识的资源OPTIONS使服务器传回该资源所支持的所有HTTP请求方法。用*来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作HEAD与GET方法一样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分,它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中关于该资源的信息(原信息或称元数据)TRACE显示服务器收到的请求,主要用于测试或诊断CONNECTHTTP/1.1中预留给能够将连接改为通道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)其中,最常见的是GET和POST方法,如果是RESful接口的话一般会用到PUT、DELETE、GET、POST(分别对应增删查改),这里附上一篇有关REST的文章什么是REST
请求头可用于传递一些附加信息,格式为:键: 值,注意冒号后面有一个空格:
请求和响应常见通用的Header
名称作用Content-Type请求体/响应体的类型,如:text/plain、application/jsonAccept说明接收的类型,可以多个值,用,(英文逗号)分开Content-length请求体/响应体的长度,单位字节Content-Encoding请求体/响应体的编码格式,如gzip、deflateAccept-Encoding告知对方我方接受的Content-EncodingETag给当前资源的标识,和Last-Modified、If-None-Match、If-Modified-Since配合,用于缓存控制Cache-Control取值一般为no-cache、max-age=xx,xx为整数,表示资源缓存有效期(秒)常见的请求Header
名称作用Authorization用于设置身份认证信息User-Agent用户标识,如:OS和浏览器的类型和版本If-Modified-Since值为上一次服务器返回的Last-Modified值,用于确定某个资源是否被更改过,没有更改过就从缓存中读取If-None-Match值为上一次服务器返回的ETag值,一般会和If-Modified-SinceCookie已有的CookieReferer标识请求引用自哪个地址,比如你从页面A跳转到页面B时,值为页面A的地址Host请求的主机和端口号请求体(又叫请求正文)是post请求方式中的请求参数,以key = value形式进行存储,多个请求参数之间用&连接,如果请求当中请求体,那么在请求头当中的Content-Length属性记录的就是该请求体的长度
根据应用场景的不同,HTTP请求的请求体有三种不同的形式
移动开发者常见的,请求体是任意类型的,服务器不会解析请求体,请求体的处理需要自己解析,如POST JSON的时候就是这类
第二种和第三种都有固定的格式,是服务器端开发人员最先了解的两种。这里的格式要求就是URL中Query String的格式要求:多个键值对之间用&连接,键与值之间用=连接,且只能用ASCII字符,非ASCII字符需使用UrlEncode编码
第三种请求体被分成多个部分,文件上传时会被使用,这种格式最先是被用于邮件传输中,每个字段/文件都被boundary(Content-Type中指定的)分成单独的段,每段以--加boundary开头,然后是该段的描述头,描述头之后空一行接内容,请求结束的标识为boundary后面加--
区分是否被当成文件的关键是Content-Disposition是否包含filename,因为文件有不同的类型,所以还要使用Content-Type指示文件的类型,如果不知道是什么类型取值可以为application/octet-stream表示文件是一个二进制的文件,如果不是文件则Content-Type可以省略
HTTP响应的格式上除状态行(第一行)与请求报文的请求行不一样之外,其他的就格式而言是一样的,但排除状态行和请求行的区别,从Header上还是可以区分出HTTP请求和HTTP响应的区别的,怎么区别就要看前面的Header啦
状态码(就是上图中的响应码),如果想查看各种状态码具体的含义,可以看一下这篇文章HTTP状态码对照表,当然这么多状态码要想全部都记住的话,还是比较困难的。
在平时我们只要记住这些就差不多了
状态码对应的信息1XX提示信息—表示请求已接收,继续处理2XX用于表示请求已被成功接收、理解、接收3XX用于表示资源(网页等)被永久转移到其它URL,也就是所谓的重定向4XX客户端错误—请求有语法错误或者请求无法实现5XX服务器端错误—服务器未能实现合法的请求响应头同样可用于传递一些附加信息
常见的响应Header
名称作用Date服务器的日期Last-Modified该资源最后被修改的时间Transfer-Encoding取值一般为chunked,出现在Content-Length不能确定的情况下,表示服务器不知道响应板体的数据大小,一般同时出现Content-Encoding响应头Set-Cookie设置CookieLocation重定向到另一个URL,如输入浏览器就输入baidu.com回车,会自动跳转到https://www.baidu.com 就是通过这个响应头控制的Server后台服务器响应体也就是网页的正文内容,一般在响应头中会用Content-Length来明确响应体的长度,便于浏览器接收,对于大数据量的正文信息,也会使用chunked的编码方式
你应该知道的HTTP基础知识 http协议-简介