深入web请求

来源:互联网 发布:沈阳云易惠网络 编辑:程序博客网 时间:2024/06/11 21:00

如何发起一个web请求

其实发起一个http请求和建立一个socket连接区别不大,只不过outputStream.write里边二进制字节数据格式要符合http的标准,浏览器在建立socket连接之前,根据在地址栏输入的域名DNS解析出ip地址,再根据这个ip地址和默认的80端口与远程服务器建立socket连接,然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待InputStream.read返回数据最后断开连接。

总结就是。http请求就是建立一个短暂的socket连接的过程。
java中使用httpclient类就可以模拟请求过程,如果对请求非常熟悉,甚至可以自己写一个httpclient工具包,甚至是浏览器。

HTTP解析

B/S架构的核心是HTTP,掌握HTTP协议对从事互联网工作的程序员非常重要,有一句话说的是“你能对这个工作做得多好,取决于你对它了解的多深”。

要理解http,最重要的是熟悉HTTP中的HTTP header,它控制着成千上万的用户的数据的传输,最关键的是它控制着用户浏览器的渲染行为和服务器的执行逻辑,例如,当服务器没有用户请求的数据时就会返回一个404的状态码。

常见的请求头

  • Accept-Charset 用于指定客户端接受的字符集
  • Accept-Encoding 用于指定可接受的内容编码,如:gzip,deflate。(我之前做网站时,进行百度的评分要求一定要开启gzip压缩)
  • Accept-Language 用于指定自然语言 如:zh-cn(中文)
  • Host 指定被请求资源的Internet主机和端口号
  • User-Agent 客户端将它的操作系统 、浏览器和其他属性告诉服务器(通过这个参数可以判断是要访问移动端网站还是pc端)
  • Connection 当前连接是否保持 如:keep-alive

常见的HTTP响应头

  • Server 使用的服务器名称,如:Server:Apache/1.3.6(Unix)
  • Content-type 指明实体正文的媒体类型,如text/html;charset=GBK,移动端一般是Json或者xml
  • Content-Encoding 与Accpet-Encoding对应,压缩编码类型
  • Content-Language 自然语言,与Accept-Language对应
  • Content-Length 指明实体正文的长度,用以字节方式存储的十进制来表示
  • Keep-Alive 保持连接的时间,如keep-alive:timout=5 max=120

常见的HTTP状态码
- 200 请求成功
- 302 临时跳转,地址通过location指定
- 400 客户请求有语法错误,不能识别。
- 403 服务器收到请求,但拒绝提供服务
- 404 请求的资源不存在
- 500 服务器发生不可预期的错误

要查看http信息可以通过浏览器的开发者模式,firefox和chrome一般是首选。

比如我们百度一下。
请求头

Host: www.baidu.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateReferer: http://i.g-fox.cn/rd20.html?engine=baidu_web&q=java+webCookie: BAIDUID=C89E73E5EB7AC49C48889FB255CA9773:FG=1; BAIDUPSID=C89E73E5EB7AC49C48889FB255CA9773; BD_UPN=13314352Connection: keep-alive

响应头

BDPAGETYPE: 3BDQID: 0xd3d806820001e99aBDUSERID: 0CKPACKNUM: 2CKRNDSTR: 20001e99aCache-Control: privateConnection: Keep-AliveContent-Encoding: gzipContent-Length: 71179Content-Type: text/html;charset=utf-8Date: Sun, 01 Mar 2015 06:56:10 GMTP3p: CP=" OTI DSP COR IVA OUR IND COM ", CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'Proxy-Connection: keep-aliveServer: BWS/1.1Set-Cookie: BDRCVFR[kpkBv0s1F-3]=srT4swvGNE6uzdhUL68mv3; path=/; domain=.baidu.comBD_CK_SAM=1;path=/BDSVRTM=8; path=/H_PS_PSSID=1430_10632; path=/; domain=.baidu.comVary: Accept-EncodingX-Powered-By: HPHP

浏览器缓存机制

有时候浏览器在浏览页面时发现页面有异常,我们就可以使用Ctrl+F5来刷新一下,重新请求一次这个页面。而不会使用缓存的数据。不过请求到的也有可能是缓存的数据,比如大部份高流量的网站为了节约性能都设置一个缓存服务器,如Varnish代理。

比如我们刷新一下刚才的请求

Host: www.baidu.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateReferer: http://i.g-fox.cn/rd20.html?engine=baidu_web&q=java+webCookie: BAIDUID=C89E73E5EB7AC49C48889FB255CA9773:FG=1; BAIDUPSID=C89E73E5EB7AC49C48889FB255CA9773; BD_UPN=13314352; BDRCVFR[kpkBv0s1F-3]=srT4swvGNE6uzdhUL68mv3; BD_CK_SAM=1; H_PS_PSSID=1430_10632; H_PS_645EC=2927JYDA6%2BKfUJaJOgPVoYsN6IOCKN31hMlR79MbEpYwXYkL6aNX%2FeHB71Se2DvRlfH%2BConnection: keep-alivePragma: no-cacheCache-Control: no-cache

看比原来多了两个参数
Pragma: no-cache
Cache-Control: no-cache

Cache-Control: no-cache/proma的作用

这个http head字段用于指定所有缓存机制在整个请求/响应中必须服从的指令,如果知道该页面是否为缓存 ,不但可以控制浏览器,还可以控制和http相关的缓存或代理服务器。
http 可选字段
- Public :所有内容都将被缓存,在响应头的设置
- Private :内容只缓存到私有缓存中,在响应头中设置
- no-cache :所有内容都不会被缓存,在请求和响应头的设置
- no-store:所有内容都不会被缓存到缓存或Internet临时文件中,在响应头的设置
- must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证。在请求头中设置
- max-age=xxx:缓存的内容将在xxx秒后失效 。这个选项只在http1.1中可用,和last-Modified一起使用时优先级较高,在响应头中设置

cache-control请求字段被各个浏览器支持得较好。它和Expires同时出现时,Cache-control会覆盖其他字段 。

Expires
格式为:Sat,25 Feb 2012 12:00:00 GMT 超过这个时间后。缓存的内容将失效,也就是浏览器在发出请求之前检查这个页面的这个字段,看该页面是否已经过期了,过期了就重新向服务器发起请求。

Last-Modified/Etag
这个字段被用于表示一个服务器上的资源的最后修改时间,资源可以是静态(静态内容自动加上Last-Modified字段)或者动态的内容(如Servlet提供了一个getLastModified方法用于检查某个动态内容是否已经更新)。

一般服务端在响应头中返回一个Last-Modified字段:Sat,25 Feb 2012 12:00:00 GMT ,当浏览器再次请求时在请求头中增加一个If-Modified-Since:Sat,25 Feb 2012 12:00:00 GMT 字段,询问当前缓存的页面是否是最新的。如果是最新的就返回304状态码。服务器就不会在传输新的数据 。
与Last-Modified字段 有类似功能的还有一个Etag字段,这个字段 是让服务器给每个页面分配 一个唯一的编号,然后通过这个编号来区分当前这个页面是否是最新的。

CDN工作机制

CDN是内容分布网络(Content delivery Network)其目的是通过现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用用户可以就近取得所需的内容。
CDN=镜像+缓存+整体负载均衡。

比如CSS JS 图片和静态页面等数据 ,都是从主站请求到动态内容后,再从CDN上下载这些静态数据 ,从而加速内容下载速度。如淘宝有90%的数据都是由CDN来提供 。

我们知道DNS解析是最后会通过离你最近的DNS服务器解析给你ip地址。CDN的工作机制就是在DNS的解析过程中间,解析到过一个属于公司的DNS服务器。然后再解析给离你最近的公司资源服务器来下载资源。

0 0
原创粉丝点击