C#基础之HTTP基础知识

 


HTTP简介


(1)HTTP的由来

HTTP即为HyperText Transfer Protocol的英文的缩写,中文翻译是超文本传输协议或者翻译为超文件传输协议,它是一种因特网上比较流行的传输协议。

HTTP最初用来发布和接收由文本组成的HTML网页页面的协议方法,后来才逐渐从只能传输文本数据,到可以传输图片文件、影视频文件,以及各种压缩、程序文件等各种文件数据。


(2)HTTP协议版本

目前使用的基本上都是HTTP/1.1版本。如下图,在访问百度的时候发的GET请求用的HTTP版本为HTTP/1.1:


(3)HTTP协议所在OSI层次

HTTP属于应用层,位于TCP/IP的顶层。如下图:

由上图可知,HTTP是基于TCP的为基础的进行工作的,所以HTTP不会出现数据丢失和数据乱序的情况。客户端通过TCP建立的链接后,用套接字发送HTTP,同理通过套接字接收HTTP的请求响应。


(4)HTTP发送请求过程

主要的过程如下:

1. 客户端与服务器建立TCP链接

2. 客户端向服务器发送请求,如果服务器接收请求,则回送响应码和所需的信息数据,响应的过程是一个异步于其他的过程的过程

3. 重复第二步,直到客户端将要和服务器断开链接

4. 客户端与服务器断开链接

注意:HTTP/1.1支持持久链接,在客户端发送一个请求直到收到响应之前,可以再次发送多个请求,即在完成一个请求和接收一个应答之后,还可以多次在这之后或者并列的完成多次"请求—应答";而对于HTTP/1.0则不支持持久链接。


(5)HTTP的特点

1. 以TCP的方式工作,上面已经分析;

2. HTTP是无状态的,即服务器不会存储关于客户端的任何状态信息,也不会保存客户端的请求究竟是何种请求类型。如果一个客户端请求两次相同的内容,服务器也会进行两次返回请求的对象内容,而不管原来是不是已经向客户端发送过这个请求的对象;

3. HTTP使用元信息作为标头,即在请求的主体之前添加一部分信息,我们把这一部分数据称之为元信息(Metainfotmation),对于源信息所在的部分,我们称之为标头(Header),上面第一个图中的Request Header即为我们请求百度页面的标头,其中的"Host: www.baidu.com"和"Connection: keep-Alive"等信息都属于元信息;


(6)HTTP/1.0和HTTP/1.1之间的区别

 HTTP/1.0HTTP/1.1
请求类型请求类型比1.1的版本少的多,定义了基本的请求类型:GET请求、POST请求和HEAD请求提供了8种请求类型:GET请求、POST请求、PUT请求、HEAD请求、DELETE请求、OPTIONS请求、TRACE请求和CONNECT请求。
是否支持长链接不支持支持
标头结构无要求,标头不需要Host部分标头部分必须有Host部分,其它都是可选部分
现使用情况几乎不再使用绝大部分浏览器和服务器都使用1.1版本


 

 

 

 

 

 


HTTP的请求与相应简述(重要)


(1)Web页面的构成

Web页面即网页页面由多个页面元素构成,我们把这些元素称之为对象或者是资源,这些对象或者资源在Web页面上由单个URL所引用,我们可以通过URL来找到访问这些对象的地址路径,进而来访问这些对象。特别的,我们把Web页面的源HTML文件也看作一个对象,即一个Web页面由其自身的源HTML文件和其页面上引用的其他对象资源文件所构成。如果一个页面中包含1个视频,1个字幕,3张图片,那么这个页面由6个对象构成。


(2)HTTP/1.1请求的种类

我们将GET、POST等的请求类型也称之为请求的方法。HTTP 1.1提供了如下表8种类型的请求方法:

请求的方法名说明
GET

请求获取特定的资源,例如,请求一个Web页面

POST请求向指定资源提交数据进行处理(例如,提交表单或者上传文件),请求的数据被包含在请求体中
PUT向指定资源位置上传其最新内容,例如,请求储存一个Web页面
HEAD向服务器请求获取与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的源信息。
DELETE请求删除指定的资源
OPTIONS返回服务器正对特定资源所支持的HTTP请求方法
TRACE回显服务器收到的请求
CONNECT预留给能够将连接改为管道方式的代理服务器


 

 

 

 

 

 

 

 

 

我们在上表中最常用的方法就是GET方法和POST方法,也称之为GET请求和POST请求。

注意:1. 如果服务器不支持或者客户端发送了错误的请求方法,服务器会返回错误并立即关闭连接;

           2. 请求的名称是区分大小写的,一般以大写的方式表示;

           3. 对于HTTP/1.1服务器至少应该事先GET和HEAD方法,而其它的方法都是可选的;


(3)HTTP请求的基本格式(重要)

格式如下:

< request-line >

< headers >

< blank line >

{ < request-body > }   

 

格式代码说明见如下表格:

请求内容说明解析
<request-line>

第一行必须是一个请求行(request line),说明请求的类型、要访问的资源以及使用的HTTP版本,这些内容之间用空格来分隔。例如:

GET / HTTP/1.1

<headers>

接着的这个是标头的部分,说明服务器要使用的附加信息,这部分一般是由多行组成。

<blank line>然后在标头之后是一个空行(blank line),它表示的标头的结束位置。而这个空行是必须要存在的无论前后的内容如何,即使不存在请求体的部分,这个空行也是必须要存在的。
<request-body>空行之后是请求的主体(request-body),主体中可以包含任意的数据。

 

 

 

 

 

 

 

注意:1. 请求行和标头必须以回车换行(<CR><LF>)作为结尾。空行内必须只有<CR><LF>而无其他空格;

           2. 在HTTP/1.1中,标头中必须有Host部分,其他都是可选的;

           3. 即使不存在请求体的部分,这个空行也是必须要存在的;

 

※这里稍微提一下<CR><LF>的含义和来源:

CR是Carriage Return的英文的缩写,意思是"回车",我们通常用" \r "来表示。

LF是Line Feed的英文缩写,意思是"换行",我们通常用" \n "来表示。

在Windows系统中用" \r\n "表示下一行,而在MAC系统中则是用" \r "表示下一行,在 Unix系统中是用" \n "表示下一行,所以上面说的是在Windows下用回车换行(<CR><LF>)作为结尾。


这里我们平时些程序的时候,最常用到的是GET请求和POST请求,我们就以这两个请求为列子,探究一下请求体的格式:

(4)GET请求的请求体举例

我们在百度的页面中输入1,然后点击"百度一下"。在Chrome的控制台中可以看到如下的内容,如图:

 
  1. GET /s?ie=utf-8&f=8&...&inputT=533 HTTP/1.1

  2. Host: www.baidu.com

  3. Connection: keep-alive

  4. Upgrade-Insecure-Requests: 1

  5. User-Agent: <...>

  6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

  7. Referer: https://www.baidu.com/?tn=02003390_15_hao_pg

  8. Accept-Encoding: gzip, deflate, br

  9. Accept-Language: zh-CN,zh;q=0.9

  10. Cookie: <...>

我把一些不重要的内容进行了省略化,我们重点分析一下重要的几行,如下分析表格:

重要行解析
第一行 (GET起始行)

这一行是由3个部分组成的,分别是"GET"、"/s?name1=value1&...&nameN=valueN"和"HTTP/1.1"组成。

【1】其中"GET"是说明请求的类型是GET请求;

【2】而" /s?name1=value1&...&nameN=valueN "部分,在" ? "之前的部分是URL地址,即Host加上"?"之前的部分,即为 " www,baidu.com/s ",如果是单纯一个" / "就表示的是网址下的根目录" www.baidu.com/ ",对于" ? "之后的部分,则是GET请求的参数,每一个参数之间通过" & "分隔,其格式如下:

                         URL?name1=value1&name2=value2&...&nameN=valueN

这一条信息被称为查询字符串(Query String);

【3】最后的" HTTP/1.1 "说明使用的HTTP协议版本是1.1版本;

第二行 (Host起始行)

第二行是Host标头,指出请求的目的地址。结合上面第一行的第二部分使用。

注意:上面已经说过HTTP1.1才需要使用标头Host,而1.0的版本是不需要的;

第三行(Connenction起始行)第三行是Connection标头,通常将浏览器操作设置为Keep-Alive(当然也可以是其他的值)。
第四行(User-Agent起始行)第四行是User-Agent标头,服务器和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由使用的浏览器来定义,并且在每个请求中都会自动发送。
最后空行

这一行在上面的图中并没有标出,但是按照上面的格式,这一行是存在的,表示标头的结束。

注意:上面已经说过即使不存在请求体的部分,这个空行也是必须要存在的。

 

 

 

 

 

 

 

 

 

 

 

 

 


(5)POST请求体举例

我们来使用一下百度翻译,翻译"乌龙茶",获得请求体如下图所示:

可以看到其中不但有请求的标头,还有表单数据。我将上面的数据整理如下:

 
  1. Request Header:

  2.  
  3. POST /langdetect HTTP/1.1

  4. Host: fanyi.baidu.com

  5. Connection: keep-alive

  6. Content-Length: 33

  7. Accept: */*

  8. Origin: https://fanyi.baidu.com

  9. X-Requested-With: XMLHttpRequest

  10. User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36

  11. Content-Type: application/x-www-form-urlencoded; charset=UTF-8

  12. Referer: https://fanyi.baidu.com/?aldtype=16047

  13. Accept-Encoding: gzip, deflate, br

  14. Accept-Language: zh-CN,zh;q=0.9

  15. Cookie: <...>

  16.  
  17.  
  18. Form Data:

  19.  
  20. query=%E4%B9%8C%E9%BE%99%E8%8C%B6

我把一些不重要的内容进行了省略化,我们重点分析一下重要的几行,如下分析表格:

重要行解析
第一行(GET起始行)

【1】第一行的第一部分请求类型修改为了POST请求;

【2】第二部分仅仅只含有URL,而不再含有" ? ",以及" ? "之后的参数部分,这部分消失的参数将会出现的请求体的表单部分中;

我们可以看到请求的地址为 "fanyi.baidu.com/langdetect "

第二行(Host起始行)、第三行(Connection起始行)、第八行(User-Agent起始行)和上面的GET请求的标头作用一致
第四行(Content-Length起始行)这一行的Content-Length标头说明了请求主体的字节数
第九行(Content-Type起始行)第九航的Content-Type标头

 

 

 

 

 

 

 

 

 


(6)HTTP响应的基本格式(重要)

格式如下:

< status-line >

< headers >

< blank line >

{ < response-body > }   

格式代码说明见如下表格:

响应内容解析说明
< status-line >第一行都会是一个状态行,该行的内容一次是当前的HTTP版本号、3位数字组成的状态码以及描述这个状态的短语组成,每个组成部分用空格分隔
< headers >、< blank line >和{ < response-body > } 之后的部分个请求体格式中的差别不大

 

 

 

 

 


(7)HTTP状态码分类及常用状态码(重要)

 

【1】状态码以第一个数字代表当前响应的类型,具体的规定如下表:

状态码大类含义解释
1XX消息请求已经被服务器接收,继续处理
2XX成功请求已经成功被服务器接收、理解并接收
3XX重定向需要后续操作才能完成这一请求
4XX请求错误请求含有词法错误或者无法被执行
5XX服务器错误服务器在处理某个正确请求的时候发生错误

 

 

 

 

 

 


【2】HTTP常用的状态码

状态码含义说明
200OK找到了资源,并且一切正常
304NOT MODIFIED该资源在上次请求之后没有任何修改(这通常用于浏览器的缓存机制)
401UNAUTHORIZED客户端无权访问该资源(这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器)
403FORBIDDEN客户端未能获得授权(这通常是在401之后输入了不正确的用户名或密码)
404NOT FOUND在指定的位置不存在所申请的资源
405METHOD NOT ALLOWED不支持对应的请求方法
501NOT IMPLEMEMTED服务器不能识别请求或者未实现指定的请求
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值