程序员都该懂点 HTTP

本篇文章已授权为微信公众号 code小生 发布

作者:developerHaoz Github 地址:developerHaoz 说明:本文主要是对 HTTP 基础知识进行总结和归纳,毕竟做 IT 的,网络这一块还是很重要的

本文的主要内容

  • HTTP 是什么
  • URL 详解
  • HTTP 之请求篇
  • HTTP 之响应篇

一、HTTP是什么

1、概述

HTTP 全称是 HyperText Transfer Protocal ,即:超文本传输协议,从 1990 年开始就在 WWW 上广泛应用,是现今在 WWW 上应用最多的协议,HTTP 是应用层协议,当你上网浏览网页的时候,浏览器和 web 服务器之间就会通过 HTTP 在 Internet 上进行数据的发送和接收。HTTP 是一个基于请求/响应模式的、无状态的协议。即我们通常所说的 Request/Response

2、特点

  • 支持客户端/服务器模式
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快
  • 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记
  • 无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完哭护的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省传输时间
  • 无状态:HTTP 协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

二、URL详解

1、简介

URL(Uniform Resource Locator)是统一资源定位符的简称,有时候也被俗称为网页地址(网址),如同是网络上的门牌,是因特网上标准的资源的地址

2、基本组成

通用的格式:schema://host[:port#]/path/…/[?query-string][#anchor]

名称

功能

schema

访问服务器以获取资源时要使用哪种协议,比如,http,https 和 FTP 等

host

HTTP 服务器的 IP 地址或域名

port#

HTTP 服务器的默认端口是 80,这种情况下端口号可以省略,如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080

path

访问资源的路径

query-string

发给 http 服务器的数据

anchor

举个例子: http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff 其中

名称

对应的字段

Schema

http

host

www.mywebsite.com

path

/js/test/test.aspx

Query-string

name=sviergn&x=true

anchor

stuff

再来张比较直观的图

URL 组成

三、HTTP 之请求篇

HTTP 的请求报文分为三个部分:请求行请求头请求体

请求报文

1、请求行

请求行(Request line)分为三个部分:请求方法请求地址协议版本

请求方法

HTTP/1.1 协议中共定义了八种方法(也叫“动作”)来以不同的方式操作指定的资源

方法名

功能

GET

向指定的资源发出“显示”请求,使用 GET 方法应该只用在读取数据上,而不应该用于产生“副作用”的操作中

POST

指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或者修改现有资源,或两者皆有。

PUT

向指定资源位置上传其最新内容

DELETE

请求服务器删除 Request-URI 所标识的资源

OPTIONS

使服务器传回该资源所支持的所有HTTP请求方法。用*来代替资源名称,向 Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作

HEAD

与 GET 方法一样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分,它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中关于该资源的信息(原信息或称元数据)

TRACE

显示服务器收到的请求,主要用于测试或诊断

CONNECT

HTTP/1.1 中预留给能够将连接改为通道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器)

其中,最常见的是 GET 和 POST 方法,如果是 RESful 接口的话一般会用到 PUT、DELETE、GET、POST(分别对应增删查改),这里附上一篇有关 REST 的文章 什么是 REST

2、请求头

请求头可用于传递一些附加信息,格式为:键: 值,注意冒号后面有一个空格

请求头

请求和响应常见通用的 Header

名称

作用

Content-Type

请求体/响应体的类型,如:text/plain、application/json

Accept

说明接收的类型,可以多个值,用,(英文逗号)分开

Content-length

请求体/响应体的长度,单位字节

Content-Encoding

请求体/响应体的编码格式,如 gzip、deflate

Accept-Encoding

告知对方我方接受的 Content-Encoding

ETag

给当前资源的标识,和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-Since

Cookie

已有的Cookie

Referer

标识请求引用自哪个地址,比如你从页面 A 跳转到页面 B 时,值为页面 A 的地址

Host

请求的主机和端口号

请求体

请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&连接,如果请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度

包含请求体的请求消息

根据应用场景的不同,HTTP 请求的请求体有三种不同的形式

第一种:

移动开发者常见的,请求体是任意类型的,服务器不会解析请求体,请求体的处理需要自己解析,如 POST JSON 的时候就是这类

HTTP请求,形式一

第二种:

第二种和第三种都有固定的格式,是服务器端开发人员最先了解的两种。这里的格式要求就是 URL 中 Query String 的格式要求:多个键值对之间用&连接,键与值之间用=连接,且只能用 ASCII 字符,非 ASCII 字符需使用UrlEncode编码

HTTP 请求,形式二

第三种:

第三种请求体被分成多个部分,文件上传 时会被使用,这种格式最先是被用于邮件传输中,每个字段/文件都被 boundary(Content-Type中指定的)分成单独的段,每段以--加 boundary 开头,然后是该段的描述头,描述头之后空一行接内容,请求结束的标识为 boundary 后面加--

HTTP 请求,形式三

区分是否被当成文件的关键是 Content-Disposition 是否包含 filename,因为文件有不同的类型,所以还要使用 Content-Type 指示文件的类型,如果不知道是什么类型取值可以为 application/octet-stream 表示文件是一个二进制的文件,如果不是文件则 Content-Type 可以省略

四、HTTP 之响应篇

HTTP 响应的格式上除状态行(第一行)与请求报文的请求行不一样之外,其他的就格式而言是一样的,但排除状态行和请求行的区别,从 Header 上还是可以区分出 HTTP 请求和 HTTP 响应的区别的,怎么区别就要看前面的 Header 啦

HTTP 响应报文

1、响应状态行

状态码

状态码(就是上图中的响应码),如果想查看各种状态码具体的含义,可以看一下这篇文章HTTP状态码对照表,当然这么多状态码要想全部都记住的话,还是比较困难的。

在平时我们只要记住这些就差不多了

状态码

对应的信息

1XX

提示信息—表示请求已接收,继续处理

2XX

用于表示请求已被成功接收、理解、接收

3XX

用于表示资源(网页等)被永久转移到其它 URL,也就是所谓的重定向

4XX

客户端错误—请求有语法错误或者请求无法实现

5XX

服务器端错误—服务器未能实现合法的请求

2、响应头

响应头同样可用于传递一些附加信息

响应头

常见的响应 Header

名称

作用

Date

服务器的日期

Last-Modified

该资源最后被修改的时间

Transfer-Encoding

取值一般为 chunked,出现在 Content-Length 不能确定的情况下,表示服务器不知道响应板体的数据大小,一般同时出现Content-Encoding响应头

Set-Cookie

设置 Cookie

Location

重定向到另一个 URL,如输入浏览器就输入 baidu.com 回车,会自动跳转到https://www.baidu.com 就是通过这个响应头控制的

Server

后台服务器

3、响应体

响应体也就是网页的正文内容,一般在响应头中会用 Content-Length 来明确响应体的长度,便于浏览器接收,对于大数据量的正文信息,也会使用 chunked 的编码方式。


猜你喜欢

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我的 2017

    不知不觉,2017 已经过去了,回头想想这一年的经历,确实发生了不少事情,以前一直没有写年终总结的习惯,一方面是自己觉得好像没有什么内容可写,另一方面是没有写作...

    developerHaoz
  • Android 谈谈 Handler 那些事一、Handler是什么

    Handler 是 Android 中引入的一种让开发者参与处理线程中消息循环的机制,Handler直接继承自 Object,每个 Handler 都关联了一个...

    developerHaoz
  • Android 基于 glide 4.0 封装图片加载库

    很多时候只要简单的调用一行代码实现图片的高性能加载(对于 glide 这个框架不熟悉的同学,可以看一下我这篇文章 glide 一个强大的图片加载框架 ),使用起...

    developerHaoz
  • 网络编程 | HTTP协议概要

    在2017年10月深圳 Cocos 沙龙上,有幸结识了社区中大名顶顶的Colin,Shawn在论坛上第一次看到Colin的团队用CocosCreator制作的《...

    张晓衡
  • Python处理HTTP请求之requests指北

    如果你需要在Python中进行HTTP请求的处理,有很多种方式可以使用。比较原始的有Python的内置库urllib、也有比较高级一点的第三方模块aiohttp...

    州的先生
  • http 协议详解

    HTTP 协议,即超文本传输协议 (Hypertext transfer protocol)。 是一种详细规定了浏览器和万维网 (WWW = World Wid...

    信安之路
  • 压力测试工具:apache bench(ab)

    作为php后端工程师,除了实现业务需求之外,需要考虑的就是自己写的服务,在大并发下是否能正常运行了,例如在我之前文章讲到的,在并发下,数据库查询可能会造成脏读幻...

    仙士可
  • Nginx可以做什么? 看完这篇你就懂了!

    之前我们介绍了LVS和HAProxy两种负载均衡器,今天我们来介绍另外一种负载均衡器Nginx。当然Nginx不只具有负载均衡功能, 还有很多很强大的功能。今天...

    小土豆Yuki
  • HTTP常见面试题

    HTTP常见面试题 Http与Https的区别: Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https...

    Java3y
  • 爬虫篇|不会抓包,谈何爬虫(七)

    所谓的http代理,其实就是代理客户机的http访问,主要代理浏览器访问页面。 代理服务器是介于浏览器和web服务器之间的一台服务器,有了它之后,浏览器不是直...

    润森

扫码关注云+社区

领取腾讯云代金券