为什么做web前端要了解http标准?因为浏览器要从服务端获取网页,网页也可能将信息再提交给服务器,这其中都有http的连接。web系统既然和http链接有瓜葛,你就必须去了解它。我将从一下几个方面讲解一下http标准:

  1. http请求的过程
  2. http状态码的意义
  3. http头部信息
  4. cookie状态管理
  5. 方法Get POST

http请求的过程

1、连接

当我们输入一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把域名变成ip,如果url里不包含端口号,则会使用该协议的默认端口号。

DNS的过程是这样的:首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,该请求将一直发送到根直到得到结果。现在已经拥有了目标ip和端口号,这样我们就可以打开socket连接了。(具体可参考:从输入URL到页面加载完成都发生了什么?)

2、请求

连接成功后,web浏览器开始向web服务器发送请求,这些请求一般是GET或者POST请求。POST请求表单(form)参数传递GET命令的格式为:路径/文件名

3、应答

Web服务器接收到这个请求之后开始处理。服务器从它的文档空间空搜索子目录的文件。如果找到该文件,则把该文件内容传输给web浏览器。同时,为了告知浏览器,web服务器会传输一些HTTP头信息,HTTP头信息和信息体之间会有一行空行隔开,常用的HTTP头信息有:

  • HTTP 1.0 200 OK这是web服务器应答的第一行,列出正在运行的HTTP的版本号和应答代码。代码200代表请求完成。(具体代码请参考常见的iis日志代码
  • MIME_Version:1.0 它指示MIME类型的版本
  • content_type:类型 这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html 指示传送的数据是HTML文档。
  • content_length:长度值 它指示HTTP体信息的长度(字节)。

4、关闭连接

当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。

http状态码的意义

1xx:信息,请求收到,继续处理
2xx:成功,行为被成功地接受、理解和采纳
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误,请求包含语法错误或者请求无法实现
5xx:服务器错误,服务器不能实现一种明显无效的请求

100系列码

从100到199范围的HTTP状态码是信息报告码。基于各种原因考虑,大多数情况下我们是
很少看见这些代码的。首先,如果一个浏览器尝试访问一个网站,而网站返回这些代码时,它们往往都不会显示在屏幕上。它们只是浏览器使引用的内部码。另外, 这些代码不常见的另外一个原因是起初HTTP标准不允许使用这一范围的状态码。就其本身而言,它们也一直没有被广泛地使用。

200系列码

从200到299范围的状态码是操作成功代码。同样的,在正常的Web上网中,你也很可能不
曾在屏幕上看到这些代码。相反的,这些代码是在浏览器内部使用的,用以确认操作成功确认和当前请求状态。虽然这些代码通常不显示,但是有一些故障排除工具 能够读到它们,就像和其它大多数的HTTP状态码一样,它们在错误诊断过程中是非常有用的。

300系列码

从300到399范围的状态码是重定向代码。本质上,它们告诉Web浏览器必须执行其它一些
操作以完成请求。基于这个命令的特点,它可以自动地执行,或者要求额外的用户输入。比如,状态码301表示一个特定资源已经被永久地先移除,因此将来所有
访问该资源请求都应该定向到一个特定的URL上。

400系列码

在400范围的状态码是客户端错误码。这种类型的错误码往往跟安全相关。比如,如果一个客户
端尝试访问一个未授权访问的资源,服务器就会返回一个状态码401。类似地,如果客户端尝试访问一个禁止的资源,在这种情况下客户端的认证状态是一样的,
那么服务器可能会返回一个状态码403,表示禁止对该资源进行访问。

如果请求不正确或客户端超时,400级错误码也可能被返回。然而,有一个400级的代码总是 具有误导性:404。虽然这个代码在技术上被归类为客户端错误,但是事实上它可以同时表示客户端或服务器上的错误。但这个错误码只是简单地显示为没有找到
请求的资源。当这个错误发生在客户端时,它往往表示的是网络连接问题。在其他时候,这个错误的发生还可能是由于资源已从服务器上转移或重命名而造成的。

500系列码

500级状态码表示的是服务器错误。比如,如果Web服务器超时,它就会产生一个504错 误。虽然,一个500级的错误往往表示的不是服务器的问题,而是在服务器上运行的Web应用的问题。比如,我自己的个人网站是用ASP编写的,它负责动态 生成HTML网页。在调试的过程中,有Bug的代码总会导致我的Web服务器返回HTTP状态码500,该代码是一般表示内部服务器错误。这个代码只是出 现问题了,并且HTTP无法解决该问题。

具体代码请参考常见的iis日志代码

http头部信息

我们任意打开一个网站如www.shell.com

可以看到Request Header(请求头)里的内容

其中包含:Accept、Accept-Charset、Accept-Encoding、Accept-language、Authorization、If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range、Range、Proxy-Authenticate、Proxy-Authorization、Host、Referer、User-Agent

1、Accept

告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。

2、Accept-Charset

浏览器告诉服务器自己能接收的字符集。

3、Accept-Encoding

浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。

4、Accept-Language

浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。

5、Authorization

当客户端接收到来自WEB服务器的
WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。

6、If-Match

如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作,获取文档。

7、If-None-Match

如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作,获取文档。

8、If-Modified-Since

如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT

9、If-Unmodified-Since

如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。

10、If-Range

浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的ETag 或者自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。

12、Range

浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546

13、Proxy-Authenticate

代理服务器响应浏览器,要求其提供代理身份验证信息。

14、Proxy-Authorization

浏览器响应代理服务器的身份验证请求,提供自己的身份信息。

15、Host

客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。如Host:rss.sina.com.cn

16、Referer

浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL,例如:Referer:http://www.ecdoer.com/

17、User-Agent

浏览器表明自己的身份(是哪种浏览器)。例如:Mozilla/5.0
(Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143
Safari/537.36

cookie状态管理

定义:客户端(浏览器)向服务器发出一个请求,服务器会将一小段字符串以set-cookie消息头的方式发回给客户端,浏览器会存储这一小段信息,当客户端再次向服务器发出请求时,在某些条件下,浏览器会自动发送存储的这一小段文本信息给到服务器端。某些条件是指:检测时间是否已经过期,检测路径是否符合规则。

1、什么是cookie?

浏览器在访问服务器时,服务器将一些数据以set-cookie消息头的形式发送给浏览器。浏览器会将这些数据保存起来。当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式 发送给服务器。通过这种方式,可以管理用户的状态。

2、如何创建cookie

当然是服务器端创建,Response.SetCookie

3、获取cookie

当然是浏览器获取,Request.GetCookie

4、cookie的保存时间

可以设置cookie的过期时间,如果不设置cookie的过期时间,那么此cookie的过期时间就是浏览器回话期间,如果浏览器关闭,cookie就会失效。

5、如何清除cookie

把当前cookie的过期时间设置成过期时间就好了。

方法Get POST

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

GET - 从指定的资源请求数据。

POST - 向指定的资源提交要被处理的数据

 

有关 GET 请求的其他一些注释:

GET
请求可被缓存

GET
请求保留在浏览器历史记录中

GET
请求可被收藏为书签

GET
请求不应在处理敏感数据时使用

GET
请求有长度限制

GET
请求只应当用于取回数据

POST 方法

请注意,查询字符串(名称/值对)是在 POST
请求的 HTTP 消息主体中发送的:

POST
/test/demo_form.asp HTTP/1.1

Host:
w3schools.com

name1=value1&name2=value2

有关 POST 请求的其他一些注释:

POST 请求不会被缓存

POST 请求不会保留在浏览器历史记录中

POST 不能被收藏为书签

POST 请求对数据长度没有要求

下面的表格比较了两种 HTTP 方法:GET 和 POST。

 

GET

POST

后退按钮/刷新

无害

数据会被重新提交(浏览器应该告知用户数据会被重新提交)。

书签

可收藏为书签

不可收藏为书签

缓存

能被缓存

不能缓存

编码类型

application/x-www-form-urlencoded

application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。

历史

参数保留在浏览器历史中。

参数不会保存在浏览器历史中。

对数据长度的限制

是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。

无限制。

对数据类型的限制

只允许 ASCII 字符。

没有限制。也允许二进制数据。

安全性

与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。

在发送密码或其他敏感信息时绝不要使用 GET !

POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。

可见性

数据在 URL 中对所有人都是可见的。

数据不会显示在 URL 中。

 

说说http请求的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  3. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. nodejs之get/post请求的几种方式

    最近一段时间在学习前端向服务器发送数据和请求数据,下面总结了一下向服务器发送请求用get和post的几种不同请求方式: 1.用form表单的方法:(1)get方法 前端代码: <form act ...

  6. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  7. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  8. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  9. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  10. [转]利用URLConnection来发送POST和GET请求

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

随机推荐

  1. jquery input只允许输入数字

    $('#id').keyup(function(){ var tmptxt=$(this).val().replace(/\D|^0/g,''); $(this).val(tmptxt); });

  2. sql date 的精度问题

    new  java.sql.Date(...) 是经过yyyy-MM-dd 格式化后的时间格式. 如果需要:HH:mm:ss .则要用 new java.sql.Timestamp(.....);

  3. ubuntukylin(64bit)安装推荐

    UbuntuKylin是Ubuntu社区中面向中文用户的Ubuntu衍生版本,与麒麟系统没有关系.它是由工信部软件.集成电路促进中心(CSIP).国防科技大学(NUDT)与国际著名开源社区UBUNTU ...

  4. glance was not installed properly

  5. mysql引擎互转问题

    // InnoDB转MyISAM ALTER TABLE `tablename` ENGINE = MYISAM // MyISAM转InnoDB alter table tablename type ...

  6. Android学习路线图

    第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化 ...

  7. Zend Framework 2参考Zend\Authentication(摘要式身份验证)

    Zend Framework 2参考Zend\Authentication(摘要式身份验证) 介绍 摘要式身份验证是HTTP身份验证的方法,提高了基本身份验证时提供的方式进行身份验证,而无需在网络上以 ...

  8. Http(2)

    1.传递的请求参数如何获取 GET方式: 参数放在URI后面 POST方式: 参数放在实体内容中 核心的API: request.getParameter("参数名");  根据参 ...

  9. hibernate之.hbm.xml文件内容相关参数说明

    1.<id> 表示主键,下面介绍主键的生成机制 Increment: 由hibernate自动以递增的方式生成表识符,每次增量为1 Identity:由底层数据库生成表识符.条件是数据库支 ...

  10. cookie记录用户名和密码

    getAttribute和getParameter的区别: request.getAttribute():是request时设置的变量的值,用request.setAttribute("na ...