精华内容
下载资源
问答
  • 响应式网站 响应式网站可以根据不同屏幕尺寸的设备自动布局调整显示内容位置,响应式网站在手机端同样能访问,电脑端和手机端用的是同个网址 、小程序 依赖于一些app,比如:QQ、微信、支付宝等 不需要...

    返回目录

    一、传统网站

    手机和电脑上的页面需要分别制作,分别对应一个url
    

    二、响应式网站

    响应式网站可以根据不同屏幕尺寸的设备自动布局调整显示内容位置,响应式网站在手机端同样能访问,电脑端和手机端用的是同一个网址
    

    三、小程序

    依赖于一些app,比如:QQ、微信、支付宝等
    
    不需要下载安装
    
    开放注册的范围:个人、企业、政府、媒体及其他组织
    

    四、JavaScript

    JavaScript(简称“JS”)是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。
    

    五、jQuery

    jQuery是一个JavaScript框架。
    

    六、vue

    是一个用于创建用户界面的开源JavaScript框架,也是一个创建单页应用的Web应用框架。
    

    七、react

    react是一个简单的javascript UI库,用于构建高效、快速的用户界面。
    

    八、总结:

    JavaScript是一种编程语言
    
    jQuery、vue、react是JavaScript框架
    
    传统网站、响应式网站、小程序是网站类型
    
    展开全文
  • 第2章 请求和响应的处理 33 2.1 客户端和服务器的交流 33 2.2 Request和Response对象 35 2.2.1 Request对象成员的概述 35 2.2.2 Response对象成员概述 36 2.3 使用Form和QueryString集合 38 2.3.1 访问ASP集合...
  • 第2章 请求和响应的处理 33 2.1 客户端和服务器的交流 33 2.2 Request和Response对象 35 2.2.1 Request对象成员的概述 35 2.2.2 Response对象成员概述 36 2.3 使用Form和QueryString集合 38 2.3.1 访问ASP集合...
  • 有一点需要注意的是,javascript没有块级作用域,只有函数作用域,也就是说在for循环初始化中的var语句会创建个函数变量而非循环变量 优化循环的方法有如下 1、减少对象成员及数组项的查找次数(使用局部...

    循环

    在javaScript中的四种循环中(for、for-in、while、do-while),只有for-in循环比其它几种明显要慢,另外三种速度区别不大

    有一点需要注意的是,javascript没有块级作用域,只有函数级作用域,也就是说在for循环初始化中的var语句会创建一个函数级变量而非循环级变量

    优化循环的方法有如下

    1、减少对象成员及数组项的查找次数(使用局部变量保存需要查找的对象成员)

    2、颠倒数组的顺序来提高循环性能,也就是从最后一项开始向前处理

            for (var i = arr.length-1; i >= 0 ; i--) {
                //process
            }

    3、相信大家都会尽可能的使用for循环而非jQuery的each来遍历数组,那是因为jQuery的each方法是基于函数的迭代。尽管基于函数的迭代提供了一个更为便利的迭代方法,但它比基于循环的迭代在慢许多。

    4、有时候我们会想到底是使用if-else呢还是使用switch,事实上在大多数情况下switch比if-else运行得要快,所以当判断多于两个离散值时,switch语句是更佳的选择

    5、优化if-else最简单的方法就是确保最可能出现的条件放在首位,另外一个方法就是优化条件判断的次数,看下面的代码您就懂了

    if (value == 0) {
                    return result0;
                } else if (value == 1) {
                    return result1;
                } else if (value == 2) {
                    return result2;
                } else if (value == 3) {
                    return result3;
                } else if (value == 4) {
                    return result4;
                } else if (value == 5) {
                    return result5;
                } else if (value == 6) {
                    return result6;
                } else if (value == 7) {
                    return result7;
                } else if (value == 8) {
                    return result8;
                } else if (value == 9) {
                    return result9;
                } else if (value == 10) {
                    return result10;
                }

    下面这种方法就是使用二分搜索法将值域分成一系列区间,然后逐步缩小区范围,对上面的例子进行的优化

                if (value < 6) {
                    if (value < 3) {
                        if (value == 0) {
                            return result0;
                        } else if (value == 1) {
                            return result1;
                        } else {
                            return result2;
                        }
                    } else {
                        if (value == 3) {
                            return result3;
                        } else if (value == 4) {
                            return result4;
                        } else {
                            return result5;
                        }
                    }
                } else {
                    if (value < 8) {
                        if (value == 6) {
                            return result06;
                        } else if (value == 7) {
                            return result7;
                        }
                    } else {
                        if (value == 8) {
                            return result8;
                        } else if (value == 9) {
                            return result9;
                        } else {
                            return result10;
                        }
                    }
                }

     6、使用递归虽然可以把复杂的算法变得简单,但递归函数如果终止条件不明确或缺少终止条件会导致函数长时间运行。所以递归函数还可能会遇到浏览器“调用栈大小限制”

    使用优化后的循环来替代长时间运行的递归函数可以提升性能,因为运行一个循环比反复调用一个函数的开销要少的多

    如果循环资料太多,可以考虑使用如下介绍的达夫设备原理来提升性能

    达夫设备

            var iterations = Math.floor(items.length / 8),
                startAt = items.length % 8,
                i = 0;
            do {
                //每次循环最多可调用8次process
                switch (startAt) {
                    case 0: process(items[i++]);
                    case 7: process(items[i++]);
                    case 6: process(items[i++]);
                    case 5: process(items[i++]);
                    case 4: process(items[i++]);
                    case 3: process(items[i++]);
                    case 2: process(items[i++]);
                    case 1: process(items[i++]);
                }
                startAt = 0;
            } while (--iterations);
            var i = items.length % 8;
            while (i) {
                process(items[i--]);
            }
            i = Math.floor(items.length / 8);
            while (i) {
                process(items[i--]);
                process(items[i--]);
                process(items[i--]);
                process(items[i--]);
                process(items[i--]);
                process(items[i--]);
                process(items[i--]);
                process(items[i--]);            
            }

    Memoization

    避免重复是Memoization的核心思想,它缓存前一次计算结果供后续使用,下面代码就是利用缓存结果的思想计算阶乘的

            function memFactorial(n) {
                if (!memFactorial.cache) {
                    memFactorial.cache = {
                        "0": 1,
                        "1": 1
                    };
                }
                if (!memFactorial.cache.hasOwnProperty(n)) {
                    memFactorial.cache[n] = n * memFactorial(n - 1);
                }
                return memFactorial.cache[n];
            }

    写成通用方法如下代码所示:

            function memoize(fundamental, cache) {
                cache = cache || {};
                var shell = function (arg) {
                    if (!cache.hasOwnProperty(arg)) {
                        cache[arg] = fundamental(arg);
                    }
                    return cache[arg];
                }
                return shell;
            }
        //下面是调用示例
            function factorial(n) {
                if (n==0) {
                    return 1;
                }else{
                    return n*factorial(n-1);
                }
            }
            var memfactorial = memoize(factorial, { "0": 1, "1": 1 });
            memfactorial(6);

     

    算法和流程控制小结

    字符串优化

            str += "one" + "two";
            //以下代码分别用两行语句直接附加内容给str,从而避免产生临时字符串 性能比上面提升10%到40%;
            str += "one";
            str += "two";
            //同样你可以用如下一句达到上面同样的性能提升
            str = str + "one" + "two";
            //事实上 str = str + "one" + "two";等价于 str = ((str + "one") + "two");

    或许大家都喜欢用Array.prototype.join方法将数组中所有元素合并成一个字符串,虽然它是在IE7及更早版本浏览器 中合并大量字符串唯一高效的途径,但是事实上在现代大多数浏览器中,数组项连接比其它字符串连接的方法更慢。

    在大多数情况下,使用concat比使用简单的+和+=要稍慢些。

    快速响应用户界面

    javascript是单线程的,共用于执行javascript和更新用户界面的进程通常被称作为“浏览器UI线程”,也就是说某一时间,UI线程只能做一件事情,要么执行javascript,要么更新用户界面,假设你当前的javascript需要执行很长时间,而这时候用户点击了界面按钮,那么UI线程则无法立即响应用户点击更新按钮UI状态,导致用户以为没点击而进行多次点击操作

    所以有些浏览器会限制javascript任务的运行时间

    单个javascript操作花费的总时间不应该超过100毫秒,所以应该限制所有javascript任务在100毫秒或更短的时间内完成,但是。。。

    应该让出UI控制权(也就是停止执行javascript)使得UI线程有机会更新,然后再继续执行javascript

    使用setTimeout和setInterval来创建定时器(定时器代码只有在创建它的函数执行完成之后,才有可能被执行)

    使用setTimeout和使用setInterval几乎相同,唯一的区别在于如果UI队列中已经存在由同一个setInterval创建的任务,那么后续任务不会被添加到UI队列中

    每个定时器最好使用至少25毫秒,因为更小的延时对于大多数UI更新根本不够用

            function processArray(items,process,callback) {
                var todo = items.concat();//克隆原数组
                setTimeout(function () {
                    process(todo.shift());
                    if (todo.length > 0) {
                        setTimeout(arguments.callee, 25);
                    } else {
                        callback(items);
                    }
                }, 25);
            }
            //for example
            var items = [123, 45, 443, 35, 53, 7544, 7654, 75, 75, 32, 653, 76];
            function outputValue(value) {
                console.log(value);
            }
            processArray(items, outputValue, function () {
                console.log("Done");
            });

    同理,分割任务也是一样。

            function multiStep(steps,args,callback) {
                var tasks = steps.concat();//克隆数组
                setTimeout(function () {
                    var task = tasks.shift();//执行下一个任务
                    task.apply(null, args || []);
                    //检查是否还有其它任务
                    if (tasks.length > 0) {
                        setTimeout(arguments.callee, 25);
                    } else {
                        callback();
                    }
                }, 25);
            }
            //for example
            var tasks = [openDoc, writeText, closeDoc, updateUI];//由待执行函数组成的数组
            multiStep(tasks, [id], function () {
                console.log("Done");
            });

     相信了解过Html5的都知道,h5中引用了web worker来执行与ui更新无关的长脚本,这个也可以改善用户响应时间。具体请见我的另外博文

    web worker

    快速响应的用户界面小结

    数据传输

    有5种常用技术用于向服务器请求数据:

    1. XMLHttpRquest(XHR)
    2. Dynamic script tag insertion动态脚本注入
    3. iframes
    4. Commet
    5. Multipart XHR

    XMLHttpRquest:允许异步发送和接收数据,可以在请求中添加任何头信息和参数,并读取服务器返回的所有头信息及响应文本

    使用XHR时,POST和GET的对比,对于那些不会改变服务器状态,只会获取数据(这种称作幂等行为)的请求,应该使用GET,经GET请求的数据会被缓存起来,如果需要多次请求同一数据的时候它会有助于提升性能 。

    只有当请求的URL加上参数的长度接近或超过2048个字符时,才应该用POST获取数据,这是因为IE限制URL长度,过长时将会导致请求的URL截断

    另外需要注意的是:因为响应消息作为脚本标签的源码,所以返回的数据必须是可执行的javascript代码,所以你不能使用纯xml,纯json或其它任何格式的数据,无论哪种格式,都必须封装在一个回调函数中

    使用XHR发送数据到服务器时,GET方式会更快,因为对于少量数据而言,一个GET请求往服务器只发送一个数据包,而一个POST请求至少发送两个数据包,一个装载头信息,另一个装载POST正文,POST更适合发送大量数据到服务器

    Multipart XHR:允许客户端只用一个HTTP请求就可以从服务器向客户羰传送多个资源,它通过在服务器端将资源打包成一个由双方约定的字符串分割的长字符串并发送到客户端,然后用javaScript处理那个长字符串,并根据mime-type类型和传入的其它头信息解析出每个资源

    multipart XHR使用了流的功能,通过监听readyState为3的状态,我们可以在一个较大的响应还没有完全接受之前就把它分段处理,这样我们就可以实时处理响应片段,这也是MXHR能大幅提升性能的主要原因

    使用Multipart XHR的缺点(但是它能显著提升页面的整体性能):

    1. 获得的资源不能被浏览器缓存
    2. 老版本的IE不支持readyState为3的状态和data:URL(图片不是由base64字符串转换成二进制,而是使用data:URL的方式创建,并指定mime-type为image/jpeg    使用readyState为3是因为你不可能等所有数据都传输完成再处理,那样会很慢)

     

    Beacons技术

    使用javascript创建一个新的Image对象,并把src属性设置为服务器上脚本的URL,该URL包含我们要通过GET传回的键值对数据(并没有创建img元素,也没有插入DOM),服务器会接收到数据并保存起来,它需向客户端发送任何回馈信息。这种方式是给服务器回传信息最有效的方式,虽然它的优点是性能消耗很小,但它的缺点也显而易见

    发送的数据长度限制得相当小

    如果要接收服务器端返回的数据一种方式是监听Image对象的load事件,另外一种方式就是检查服务器返回图片的宽高来判断服务器状态

    数据格式

    现在xml这种数据格式已全然被json取代了,原因很多,主要原因是XML文件大小太大,解析速度慢,虽然XPath在解析xml文档时比getElementsByTagName快许多,但XPath并未得到广泛支持

    JSON相对xml来说,文件体积相对更少,通用性强

    JSON数据被当成另一个JavaScript文件并作为原生代码执行,为实现这一点,这些数据必须封装在一个回调函数中,这就是所谓的JSON填充(JSON with padding)JSON-P

    最快的JSON格式就是使用数组形式的JSON-P

    使用JSON-P必须注意安全性,因为JSON-P必须是可执行的JavaScript,它可能被任何人调用并使用动态脚本注入技术插入到网站,另一方面,JSON在eval前是无效的JavaScript,使用XHR时它只是被当作字符串获取,所以不要把任何敏感数据编码在JSON-P中。

    理想的数据格式应该是只包含必要的结构,以便你可以分解出每一个独立的字段,所以自定义格式相对来说体积更小点,可以快速下载,且易于解析(只要用split函数即可),所以当你创建自定义格式时,最重要的决定之一就是采用哪种分隔符

            var rows = req.responseText.split(/\u0001/);//正则表达式作为分隔符
            var rows = req.responseText.split("\u0001");//字符串作为分隔符(更为保险)

     

    数据格式总结

    缓存数据

    • 在服务器,设置HTTP头信息以确保你的响应会被浏览器缓存
    • 在客户端,把获取到的信息存储到本地,从而避免再次请求

    如果你希望Ajax响应能被浏览器缓存,请必须使用GET方式发出请求。设置Expires头信息是确保浏览器缓存Ajax响应最简单的方法,而且其缓存内容能跨页面和跨会话

    当然也可以手工管理本地缓存,也就是直接把服务器接收到的数据缓存起来

    用习惯了Ajax类库了,然后却连自己怎么写一个XMLHttpRequest都不知道了,事实上很多Ajax类库都有这样那样的局限(比如说不允许你直接访问readystatechange事件,这也意味着你必须等待完整的响应接收完毕之后才能开始使用它)所以......

    Ajax小结

    转载于:https://www.cnblogs.com/liyunhua/p/4593516.html

    展开全文
  • C#与.NET3.5高级程序设计第四版高清PDF中文完整版

    千次下载 热门讨论 2011-07-05 10:25:50
    1.9 程序集/命名空间/类型的区别  1.10 使用ildasm.exe探索程序集  1.11 使用lutz roeder的reflector来查看程序集  1.12 部署.net运行库  1.13 net的平台无关性  1.14 小结  第2章 构建c#应用程序  ...
  • 16. Hashmap和 concurrentHashmap除了线程安全 还有什么区别,put的时候是怎么处理的。 43 17. 数据库组合索引,储存在个叶子节点还是多个? 44 17.1. 索引的利弊与如何判定,是否需要索引: 44 17.1.1. 索引的...
  • 05 js练习之二级联动 06 jquery以及jquery对象介绍 07 jquery选择器 08 jquery的查找筛选器 09 jquery练习之左侧菜单 第44章 01 jquery属性操作之html,text,val方法 02 jquery循环方法和attr,prop方法 03 jquery...
  • 1.9 程序集/命名空间/类型的区别  1.10 使用ildasm.exe探索程序集  1.11 使用Lutz Roeder的Reflector来查看程序集  1.12 部署.NET运行库  1.13 NET的平台无关性  1.14 小结  第2章 构建C#应用程序  ...
  • 1.9 程序集/命名空间/类型的区别  1.10 使用ildasm.exe探索程序集  1.11 使用Lutz Roeder的Reflector来查看程序集  1.12 部署.NET运行库  1.13 NET的平台无关性  1.14 小结  第2章 构建C#应用程序  ...
  • 1.9 程序集/命名空间/类型的区别  1.10 使用ildasm.exe探索程序集  1.11 使用Lutz Roeder的Reflector来查看程序集  1.12 部署.NET运行库  1.13 NET的平台无关性  1.14 小结  第2章 构建C#应用程序  ...
  • 1.9 程序集/命名空间/类型的区别  1.10 使用ildasm.exe探索程序集  1.11 使用Lutz Roeder的Reflector来查看程序集  1.12 部署.NET运行库  1.13 NET的平台无关性  1.14 小结  第2章 构建C#应用程序  ...
  • 文章目录DOM事件绑定、DOM0级别事件绑定、DOM2级别事件绑定、DOM0事件和DOM2事件区别五、事件传参六、常用事件 、DOM0级别事件绑定 DOM0级别:DOM最早版本的事件绑定方式,被所有浏览器兼容 HTML绑定...

    DOM事件绑定

    补充:文章中所有的代码都是写在html文件中,JS代码需要用< script >< /script >标签包起来。


    一、DOM0级别事件绑定

    DOM0级别:DOM最早版本的事件绑定方式,被所有浏览器兼容

    • HTML绑定
    <input type="button" id="btn" value="click me" onclick="show()"/>
    
    • JS绑定
    document.getElementById('btn').onclick = show
    function show() {
    	console.log(1)
    }
    
    
    document.getElementById('btn').onclick = function () {
    console.log(1)
    

    JS绑定事件时,不能加(),否则会在页面加载时立即执行
    可以绑定匿名函数

    二、DOM2级别事件绑定

    DOM2级别:添加了两个监听方法来添加和移除事件处理程序

    • addEventListener()
      第一个参数为事件名,不加on
      第二个参数为函数名,不加引号
      第二个参数为函数名,不加括号()
      可以绑定匿名函数
    document.getElementById( 'btn' ).addEventListener( 'click', show )
    document.getElementById( 'btn' ).addEventListener( 'click' , function () {console.log(1)
    })
    
    • removeEventListener()
    document.getElementById( 'btn' ).removeEventListener( 'click', show)
    

    无法移除匿名添加的函数

    三、DOM0级事件和DOM2级事件区别

    1. DOM0级事件只能绑定一个函数,前面绑定的函数会被覆盖
    document.getElementById( 'btn' ).onclick = function() {
    console.log(1)
    }
    document.getElementById( 'btn' ).onclick = function() {
    console.log(2)
    }
    document.getElementById( 'btn' ).onclick = function() {
    console.log(3)
    }
    

    运行结果如下图所示:
    在这里插入图片描述

    1. DOM2级事件只能可以绑定多个函数,且有执行顺序
    document.getElementById( 'btn' ).addEventListener( 'click' , function (){
    console.log( 'a' )
    })
    document.getElementById( 'btn' ).addEventListener( 'click' , function () {
    console.log( 'b')
    })
    document.getElementById( 'btn' ).addEventListener( 'click', function () {
    console.log( 'c' )
    })
    

    运行结果如下图所示:
    在这里插入图片描述

    1. DOM0级事件与DOM2级事件互不影响
    function show() {
    	console.log( 'show' )
    }
    document.getElementById( 'btn' ).addEventListener( 'click', show)
    document.getElementById( 'btn' ).onclick = show
    

    运行结果如下图所示:
    在这里插入图片描述

    1. DOM2级事件拥有事件流,分为三个阶段
      ① 捕获事件阶段
      ② 处于目标阶段
      ③ 事件冒泡阶段
      ④ 可通过第三个可选参数控制事件流

    五、事件传参

    情况一:无法绑定成功,加括号会直接执行

    <input type="button" id="btn" value="click me"/>
    document.getElementById( 'btn' ).onclick = foo( 'hello')
    
    function foo(x) {
    	console.log(x)
    }
    
    

    情况二:行内绑定,注意加引号

    <input type="button" id="btn" value="click me" onclick="foo( 'hello' )" />
    

    情况三:使用匿名函数

    document.getElementById( 'btn' ).onclick = function() {
    foo( 'hello' )
    }
    

    补充:event为默认参数,不需传入即可调用,该对象表示触发的事件本身
    event.target会返回触发该事件的目标元素;行内调用时,传入this,this代表该元素本身

    六、常用事件

    在这里插入图片描述

    展开全文
  • 这里写目录标题一级目录二级目录三级目录HTTP协议HTTP 工作原理特点概述HTTP请求格式(请求协议)HTTP协议请求类型HTTP响应格式(响应协议)HTTP 响应头信息区别 一级目录 二级目录 三级目录 Tcp http websocek原理是...

    1 HTTP简介

    超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)的协议。
    HTTP是万维网的数据通信的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。

    HTTP协议通信流程:
    在这里插入图片描述
    HTTP协议目前最新版的版本是1.1,HTTP是一种无状态的协议,无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。==》 短连接

    HTTP协议分析

    1.1 HTTP 工作原理

    HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

    Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。

    Web服务器根据接收到的请求后,向客户端发送响应信息。

    HTTP默认端口号为80,但是你也可以改为8080或者其他端口。

    1.2 特点

    • HTTP是无连接的:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。短连接。
    • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
    • HTTP是无状态的:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
    • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
    • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
    • 支持B/S及C/S模式

    1.3 概述

    Http协议:简单的对象访问协议,对应于应用层。Http协议是基于TCP链接的。
    tcp协议:对应于传输层
    ip协议:对应与网络层
    TCP/IP是传输层协议,主要解决数据如何在网络中传输;而Http是应用层协议,主要解决如何包装数据。

    Http连接短连接,即客户端向服务器发送一次请求,服务器端相应后连接即会断掉。
    客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。通常的做法是,不需要任何数据,也要保持每隔一段时间向服务器发送"保持连接"的请求。这样可以保证客户端在服务器端是"上线"状态。

    HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。

    有两种HTTP报文的类型,请求响应,每种都有其特定的格式。

    2 HTTP请求(请求协议)

    2.1 请求格式

    客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)请求头部(header)空行请求数据四个部分组成,下图给出了请求报文的一般格式。
    在这里插入图片描述
    在这里插入图片描述
    Content-length表示请求体里面的数据长度,Content-length:16对应 内容实体 “name=ueno&age=37” 正好16个字节

    客户端请求实例
    下面实例是一点典型的使用GET来传递数据的实例:

    HTTP请求第二行为请求头(也被称为消息头)。其中,User-Agent代表浏览器的标识,请求头由客户端自行设定,HOST代表请求主机地址,Accept-Language代表可接受的响应内容语言列表。

    GET /hello.txt HTTP/1.1  //请求行,方法是GET,路径是"/hello.txt", 版本是HTTP/1.1
    User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 //请求头部
    Host: www.example.com  //服务器域名:www.example.com 
    Accept-Language: en, mi  // 可接受语言:英语、毛利语
    

    2.2 请求行

    HTTP请求第一行为请求行,由3个部分组成:

    • 请求方法(method):说明了该请求时POST请求
    • 路径(url):用来说明请求是该域名根目录下的什么对象
    • 版本(version):HTTP协议版本号。

    2.2.1 请求方法

    HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

    方法 描述
    GET 请求指定的页面信息,并返回实体主体。
    POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
    HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
    PUT 从客户端向服务器传送的数据取代指定的文档的内容。
    DELETE 请求服务器删除指定的页面。
    CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
    OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
    TRACE 回显服务器收到的请求,主要用于测试或诊断。
    PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

    在实际应用中常用 getpost,其他请求方式也都可以通过这两种方式间接的来实现。
    GET、POST、HEAD、PUT请求:

    • GET:GET方法用于获取请求页面的指定信息。如果请求资源为动态脚本(非HTML),那么返回文本是Web容器解析后的HTML源代码。GET请求没有消息主体,因此在消息头后的空白行是没有其他数据。
    • POST:POST方法也与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST是有请求内容的。
    • HEAD:这个请求的功能与GET请求相似,不同之处在于服务器不会再其响应中返回消息主体,因此,这种方法可用于检查某一资源在向其提交GET请求前是否存在。
    • PUT:PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据。向服务器上传指定的资源。

    2.2.2 URL

    路径(url):用来说明请求是该域名根目录下的什么对象

    http协议与url简介
    URL:(Uniform Resource Locator)统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。

    URI:(Uniform Resource Identifier)统一资源标识符,用于定位web上的资源。该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URL是URI的子集。

    URN:(uniform resource name)统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
    在这里插入图片描述

    HTTP的URL是一种特殊类型的URI,包含了用于定位查找某个网络资源的路径,格式:
    http://host[':'port][abs_path]

    http表示通过http协议来定位网络资源; host表示合法的Internet主机域名或者IP地址; port指定一个端口,如果缺省,默认是80端口. abs_path表示的是请求的资源的URL,如果什么都没写,则浏览器会帮我们加上/,作为初始的路径地址.

    URL详解
    以下面这个URL为例:
    http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

    1.协议部分:代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等。在"HTTP"后面的“//”为分隔符

    2.域名部分:“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

    3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80/tcp

    4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

    5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

    6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分(可以理解为定位)

    7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

    2.2.3 协议版本

    版本(version):HTTP协议版本号,如HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2.0。
    在这里插入图片描述

    当前主流的协议版本还是HTTP/1.1版本,其最大的变化就是引入了长链接,也就是TCP链接默认是不关闭的可以被多个请求复用。客户端或者服务器如果长时间发现对方没有活动就会关闭链接,但是规范的做法是客户端在最后一个请求的时候要求服务器关闭链接。对于同一个域名,目前浏览器支持建立6个长链接。

    版本 产生时间 内容 发展现状
    HTTP/0.9 1991年 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 没有作为正式的标准
    HTTP/1.0 1996年 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 正式作为标准
    HTTP/1.1 1997年 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 2015年前使用最广泛
    HTTP/2 2015年 多路复用、服务器推送、头信息压缩、二进制协议等 逐渐覆盖市场
    HTTP/3 2018年 多路复用、0-RTT、TLS加密、流量控制、丢包重传、向前纠错机制 快速发展中

    具体区别、工作原理,以及与SPDY的比较,见下一篇博文HTTP、HTTPS、SPDY、HTTP2.0、HTTP3.0 —— 通信协议学习笔记(二)

    http各个版本的区别 HTTP各个版本之间的区别

    多路复用:通过单一的HTTP/2连接请求发起多重的请求-响应消息,多个请求stream共享一个TCP连接,实现多留并行而不是依赖建立多个TCP连接。
    在这里插入图片描述

    2.3 请求头部——常见报文头的属性

    字段 说明 示例
    Accept 可接受的行营内容类型 Accept:text/plain (文本类型)
    Accept-Charset 可接收的字符集 Accept-Charset: utf-8
    Accept-Encoding 可接受的响应内容的编码方式 Accept-Encoding: gzip, deflate
    Accept-Language 可接受的响应内容语言列表 Accept-Language: en-US
    Accept-Datetime 可接受的按照时间来表示的响应内容版本 Accept-Datetime: Sat, 26 Dec 2015 17:30:00 GMT
    Authorization HTTP协议中需要认证资源的认证信息 Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE==
    Cache-Control 请求/回复中的,是否使用缓存机制 Cache-Control: no-cache
    Connection 客户端想要优先使用的连接类型 Connection: keep-alive Connection: Upgrade
    Content-Length 以8进制表示的请求体的长度 Content-Length: 348
    Content-Type 请求体的MIME类型 Content-Type: application/x-www-form-urlencoded
    Date 发送该消息的日期和时间 Date: Dec, 26 Dec 2015 17:30:00 GMT
    Expect 表示客户端要求服务器做出特定的行为 表示客户端要求服务器做出特定的行为
    From 发起此请求的用户的邮件地址 From: user@itbilu.com
    Host 服务器域名和端口号,默认端口可省略 Host: www.itbilu.com:80 or www.itbilu.com
    If-Match 主要用于PUT,实体匹配才可以操作 If-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd”
    If-Modified-Since 资源未被修改的情况下返回304未修改 If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT
    User-Agent 浏览器的身份标识字符串 User-Agent: Mozilla/
    Upgrade 要求服务器升级到一个高版本协议 Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
    Via 告诉服务器,这个请求是由哪个代理发出的 Via: 1.0 fred, 1.1 itbilu.com.com (Apache/1.1)
    Referer 表示跳转到当前页面的之前的页面 Referer: http://itbilu.com/nodejs
    Origin 发起一个针对跨域资源共享的请求 Origin: http://www.itbilu.com

    2.4 空白行

    空行是作为请求行、消息报头 与 请求正文 之间的分隔符。也有一些博客将其归到请求报头的结尾中。

    2.5 请求正文

    HTTP请求第三行为请求正文,请求正文是可选的,它最常出现在POST请求方式中。

    具体HTTP协议请求举例解析如下:
    在这里插入图片描述
    ①是请求方法 POST
    ②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
    ③是协议名称及版本号。
    ④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
    ⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。

    注意:
    1、HTTP是无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,HTTP使用的不是UDP协议(无连接)
    2、从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
    3、Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间

    3 HTTP响应(响应协议)

    3.1 响应格式

    HTTP响应也由四个部分组成,分别是:状态行消息报头空行响应正文
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    第一部分:状态行,由HTTP/1.1(协议版本) 200(状态码) OK(状态码的描述) 构成
    第二部分:响应头,由一些键值对构成,用来说明客户端要使用的一些附加信息
    第三部分:空行,响应头后面的空行时必须的
    第四部分:响应正文,服务器返回给客户端的文本信息

    服务端响应实例

    HTTP/1.1 200 OK  // 状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
    Date: Mon, 27 Jul 2009 12:28:53 GMT  // 消息报头, Date:生成响应的日期和时间为2009.7.27 12:28:53 GMT
    Server: Apache                                 // Server服务器名字为 Apache
    Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT   // 文档的最后改动时间为2009 7.22 19:15:56 GMT
    ETag: "34aa387-d-1568eb00"                     // Entity tag,被请求变量的实体值是“34aa...”
    Accept-Ranges: bytes                           // 返回值为 bytes,这代表了该服务器可以接受范围请求,这样我们就可以做断点下载的功能了。如果该值为 none,则代表不允许范围请求。
    Content-Length: 51                             // 内容长度为51
    Vary: Accept-Encoding                          // Accept-Encoding表示客户端支持的编码格式,Vary决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复。
    Content-Type: text/plain                       // 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。
    

    输出结果

    Hello World! My payload includes a trailing CRLF.
    

    3.2 状态行

    第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

    • 版本:HTTP协议版本号。
    • 状态号(status code):一个状态码,来告知对应请求执行成功或失败,以及失败的原因。
    • 状态信息:非权威的状态码描述信息,可以由服务端自行设定。

    3.2.1 HTTP协议版本

    与请求一致,具体见本文2.2.3 HTTP协议版本

    3.2.2 状态码

    常用状态码:
    在这里插入图片描述
    还有其他,诸如302:重定向,临时移动。具体见:HTTP状态码

    3.2.3 状态消息

    非权威的状态码描述信息,可以由服务端自行设定。具体见上一节的图片。

    其中状态码为“200”的状态信息为“OK”,状态码为“404”的状态信息为“Not Foundt”,

    3.3 响应头部

    第二部分:消息报头,由一些键值对构成,用来说明客户端要使用的一些附加信息

    更多常用响应头极其示例、状态详见:常用的HTTP响应头

    应答头 说明
    Allow 服务器支持哪些请求方法(如GET、POST等)
    Content-Encoding 文档的编码(Encode)方法,只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
    Content-Length 内容长度
    Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。
    Date 当前的GMT时间
    Expires 指定一个日期/时间,超过该时间则认为此回应已经过期
    Last-Modified 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)
    Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
    Refresh 用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。
    Server 服务器的名称
    Set-Cookie 设置和页面关联的Cookie
    WWW-Authenticate 表示在请求获取这个实体时应当使用的认证模式 授权信息

    另外,HTTP content-type,(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。

    Content-Type 标头告诉客户端实际返回的内容的内容类型。

    3.4 空行

    第三部分:空行,响应头后面的空行时必须的。
    空行是作为响应行、响应报头 与 响应正文 之间的分隔符。

    3.5 响应正文

    第四部分:响应正文,服务器返回给客户端的文本信息。
    空行后面的html部分为响应正文。

    <html>
          <head></head>
          <body>
                <!--body goes here-->
          </body>
    </html>
    

    4 总体图解

    在这里插入图片描述
    拦截HTTP请求的分析点:
    在这里插入图片描述

    其他参考
    HTTP协议详解
    HTTP详解-菜鸟
    HTTP协议超级详解
    关于HTTP协议,一篇就够了
    HTTP协议分析(还有Cookie)

    展开全文
  • mqtt和http的区别

    2021-03-26 10:11:58
    文章目录前言、设计和消息传递、速度和交付、复杂性和消息大小总结 前言 HTTP是最流行和最广泛使用的协议。但在过去几年中,MQTT迅速获得了牵引力。当我们谈论物联网开发时,开发人员必须在它们之间做出选择...
  • 文章目录、MySql优点:缺点:、SQL Server优点:缺点:、Oracle优点:缺点:参考文章: 、MySql 优点: 体积小、速度快、成本低 支持多种操作系统 容量大,支持存储上千万条数据 开源,提供多种语言的接口...
  • 无线通信原理与应用第版中文版

    千次下载 热门讨论 2010-10-31 20:52:41
    4.2 个多径信道的冲激响应模型 4.2.1 带宽与接收功率之间的关系 4.3 小尺度多径测量 4.3.1 直接射频脉冲系统 4.3.2 扩频滑动相关器信道检测 4.3.3 频域信道探测 4.4 移动多径信道的参数 4.4.1...
  • 径向偏振光激发环偶极子环形偶极子径向偏振光二级目录三级目录径向偏振光激发环偶极子---论文赏析环形偶极子径向偏振光合理的创建标题,有助于目录的生成如何创建个注脚 环形偶极子 径向偏振光 二级目录 三级目录 ...
  • If-Modified-Since能检查到的粒度是s的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒); * 某些服务器不能精确的得到文件的最后修改时间。 四、整体流程图 <p><img alt="672fb4ce-28f9-498d-...
  • 无线通信原理与应用(第版) 中文版

    千次下载 热门讨论 2011-05-01 21:35:17
    4.2 个多径信道的冲激响应模型 4.2.1 带宽与接收功率之间的关系 4.3 小尺度多径测量 4.3.1 直接射频脉冲系统 4.3.2 扩频滑动相关器信道检测 4.3.3 频域信道探测 4.4 移动多径信道的参数 4.4.1...
  • 本很好的书《21天学通C#》

    热门讨论 2010-07-25 18:28:53
    8.5 为控件添加响应事件 158 8.6 综合练习 159 8.7 小结 163 8.8 习题 163 第9章 使用Windows Forms和对话框(精彩视频:198分钟) 165 9.1 使用标准控件 165 9.2 公共控件 166 9.2.1 按钮控件(Button):...
  • 文章目录、可重入锁ReentrantLock1.1 什么是可重入锁1.2 为什么叫做可重入1.3 可重入锁的高级功能1.3.1 中断响应1.3.2 限时等待1.3.3公平锁1.4 相关方法1.5 可重入的要素、 Condition重入锁搭档2.1 介绍2.2 ...
  • dns服务搭建

    2020-07-24 16:12:59
    2、分类:根、顶级域名(国家/通用/基础机构域名)、二级(权限)域名、三级(本地)域名、四级域名 3、查找方式: 递归----计算机只发送次请求就可以拿到信息 迭代----计算机发送多次请求 4、二者区别: 1) ...
  • 4.1.5 ASP.NET网站和ASP.NET应用程序的区别 4.2 代码隐藏页模型的解释过程 4.3 代码隐藏页模型的事件驱动处理 4.4 ASP.NET客户端状态 4.4.1 视图状态 4.4.2 控件状态 4.4.3 隐藏域 4.4.4 Cookie 4.4.5 客户端状态...
  • performance_test learning syllabus背景为什么要做性能测试性能测试与功能测试的区别相关术语(概念)响应时间并发用户数TPS(Transaction Per Second)性能测试学习大纲、操作系统篇、通信网络及协议、Linux...
  • -增加中国的省市县三级联动示例(data/shengshixian.aspx)(feedback:Blues T)。 -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 175
精华内容 70
关键字:

一级二级三级响应区别