`

今天201011的笔试面试题

阅读更多
在基本SQL语言中,不可以实现______。A、定义视图 B、定义基表 C、查询视图和基表 D、并发控制


1.软件测试分哪两种方法?

软件测试方法一般分为两种:白盒测试与黑盒测试。

白盒测试又称为结构测试、逻辑驱动测试或基于程序本身的测试,它着重于程序的内部结构及算法,通常不关心功能与性能指标;

黑盒测试又被称为功能测试、数据驱动测试或基于规格说明的测试,它实际上是站在最终用户的立场,检验输入输出信息及系统性能指标是否符合规格说明书中有关功能需求及性能需求的规定。


2.一套完整的测试应该由哪些阶段组成?分别阐述一下各个阶段。
 
    计划阶段、设计阶段、白盒单元、白盒集成、黑盒单元、黑盒集成、系统测试、回归测试、验收测试一套完整的测试应该由五个阶段组成:
    1)测试计划首先,根据用户需求报告中关于功能要求和性能指标的规格说明书,定义相应的测试需求报告,即制订黑盒测试的最高标准。以后所有的测试工作都将围绕着测试需求来进行,符合测试需求的应用程序即是合格的,反之即是不合格的;同时,还要适当选择测试内容,合理安排测试人员、测试时间及测试资源等。
 
     2)测试设计将测试计划阶段制订的测试需求分解、细化为若干个可执行的测试过程,并为每个测试过程选择适当的测试用例(测试用例选择的好坏将直接影响测试结果的有效性)。
 
     3)测试开发建立可重复使用的自动测试过程。
 
     4)测试执行执行测试开发阶段建立的自动测试过程,并对所发现的缺陷进行跟踪管理,测试执行一般由单元测试、组合测试、集成测试、系统联调及回归测试等步骤组成,测试人员应本着科学负责的态度,一步一个脚印地进行测试。
 
     5)测试评估结合量化的测试覆盖域及缺陷跟踪报告,对于应用软件的质量和开发团队的工作进度及工作效率进行综合评价。


-------------另外一个答案
一套完整的测试应该由五个阶段组成:

  1.测试计划

  首先,根据用户需求报告中关于功能要求和性能指标的规格说明书,定义相应的测试需求报告,即制订黑盒测试的最高标准,以后所有的测试工作都将围绕着测试需求来进行,符合测试需求的应用程序即是合格的,反之即是不合格的;同时,还要适当选择测试内容,合理安排测试人员、测试时间及测试资源等。

  2.测试设计

  将测试计划阶段制订的测试需求分解、细化为若干个可执行的测试过程,并为每个测试过程选择适当的测试用例(测试用例选择的好坏将直接影响到测试结果的有效性)。

  3.测试开发

  建立可重复使用的自动测试过程。

  4.测试执行

  执行测试开发阶段建立的自动测试过程,并对所发现的缺陷进行跟踪管理。测试执行一般由单元测试、组合测试、集成测试、系统联调及回归测试等步骤组成,测试人员应本着科学负责的态度,一步一个脚印地进行测试。

  5.测试评估

  结合量化的测试覆盖域及缺陷跟踪报告,对于应用软件的质量和开发团队的工作进度及工作效率进行综合评价。

  显然,黑盒测试只有严格按照步骤进行,才可能对应用程序的质量进行把关。然而,如果没有一种优秀的测试工具的帮助,单纯凭借手工测试,不但将耗费大量的人力、物力和财力,而且有很多测试工作是难以实现甚至是无法实现的。




软件验收测试包括______三种类型。
实施验收测试的常用策略有三种,它们分别是:  
 · 正式验收   · 非正式验收或 Alpha 测试   · Beta 测试


资料来源: http://baike.baidu.com/view/649815.htm


α β测试
  事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。 α测试是指软件开发公司组织内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的 用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。 一般包括功能度、安全可靠性、易用性、可扩充性、兼容性、效率、资源占用率、用户文档八个方面。


package com.mianshi.test;

public class Test1 {
	public static void main(String[] args) {
		int x = 0x80000000;
		x = x>>2; System.out.println(" x >> 2  = " + x);
		x = x<<2; System.out.println(" x << 2  = " + x);
		x = x>>>2; System.out.println(" x >>> 2 = " + x);
	}

}


结果
 x >> 2  = -536870912
 x << 2  = -2147483648
 x >>> 2 = 536870912


笔试题最终问的是 x 最终的结果不可能的是?
A. x= -536870912

B. x= 536870912  

分析:这题你不会也可以,看到>>>你就应该知道最终结果肯定是一个正整数,不可能是一个负数,所以答案一下就出来了。


select t.salary, t.rowid from employee t
where t.salary > 40000 and t.salary < 25000
or t.salary between 30000 and 35000
or t.salary in (37500,55000,42500);

which two will be selected?
A.32000
B.42500

C.22500
D.52500
E.20000

create table EMPLOYEE
(
  SALARY NUMBER(7,2)
)

insert into employee   salary values(32000);
insert into employee   salary values(42500);
insert into employee   salary values(22500);
insert into employee   salary values(52500);
insert into employee   salary values(20000);



四.软件设计中划分模块的一个准则是_1_。两个模块之间的耦合方式中,_2_耦合的耦合度最高,_3_耦合的耦合度最低。一个模块内部的内聚种类中_4_内聚的内聚度最高,_5_内聚的内聚度最低。 CDBCA
供选择的答案
1:A低内聚低耦合     B低内聚高耦合     C高内聚低耦合    D高内聚高耦合
2:A数据         B非直接        C控制        D内容
3:A数据         B非直接        C控制        D内容
4:A偶然         B逻辑         C功能        D过程
5:A偶然         B逻辑         C功能        D过程



原题:虚存页面调整算法有多种,______ 调度算法不是页面调度算法.
供选择的答案
A.后进先出 
B.先进先出   C.最近最少使用   D.随机选择


(1)页面调度算法


目前有许多页面调度算法,下面介绍先进先出调度算法(FIFO)、最近最少调度算法(LRU)、最近最不常用调度算法(LFU)、最佳算法(OPT)

假设,进程在创建时由操作系统为之分配一个固定数目物理页,执行过程中物理页的数目和位置不会改变。也即进程进行页面调度时只能在分到的几个物理页中进行。


  下面对各调度算法的思想作一介绍。
  <1> 先进先出调度算法
  先进先出调度算法根据页面进入内存的时间先后选择淘汰页面,先进入内存的页面先淘汰,后进入内存的后淘汰。本算法实现时需要将页面按进入内存的时间先后组成一个队列,每次调度队首页面予以淘汰。

  <2>最近最少调度算法
  先进先出调度算法没有考虑页面的使用情况,大多数情况下性能不佳。根据程序执行的局部性特点,程序一旦访问了某些代码和数据,则在一段时间内会经常访问他们,因此最近最少用调度在选择淘汰页面时会考虑页面最近的使用,总是选择在最近一段时间以来最少使用的页面予以淘汰。算法实现时需要为每个页面设置数据结构记录页面自上次访问以来所经历的时间。

  <3>最近最不常用调度算法
  由于程序设计中经常使用循环结构,根据程序执行的局部性特点,可以设想在一段时间内经常被访问的代码和数据在将来也会经常被访问,显然这样的页面不应该被淘汰。最近最不常用调度算法总是根据一段时间内页面的访问次数来选择淘汰页面,每次淘汰访问次数最少的页面。算法实现时需要为每个页面设置计数器,记录访问次数。计数器由硬件或操作系统自动定时清零。



----------------------

一、基本概念
1.绝对地址和逻辑地址
绝对地址:主存储器以字节为编址单位,每个字节都有一个地址与其对应。这些地址成为
主存储器的“绝对地址”,由绝对地址对应的主存储空间称为“物理地址空间”。

逻辑地址:用户程序中使用的地址称为“逻辑地址”,由逻辑地址对应的存储空间称为“逻
辑地址空间”。逻辑地址从0开始编址。
2.地址重定位
重定位:将程序地址空间中使用的逻辑地址变换成主存中的地址的过程,也称为地址重定
位。重定位分为静态重定位和动态重定位。
静态重定位:在作业程序链接装入过程中随即进行的地址变换方式称为静态重定位或静态
地址映射。
动态重定位:指在程序执行期间,随着每条指令和数据的访问自动地连续地进行映射。
二、分页存储管理
1.分页原理
将一个进程的地址空间划分成若干大小相等的区域,称为页。相应地,将主存空间划分成
与页相同大小的若干物理块,称为块或页框架。在为进程分配主存时,将进程中若干页分别装
入多个不邻接的块中。
2.地址结构
由两部分组成:前一部分为页号P;后—部分为偏移量w,即页内地址。图2-2中的地址长
度为32位,其中0~11位为页内地址(每页的大小为4KB),12~31位为页号,所以允许地址空
间的大小最多为1MB个页。


3.地址变换
系统为每个进程建立了一张页面映射表,简称页表,如图2-3所示。每个页在页表中占一个
表项,记录该页在内存中对应的物理块号。进程在执行时,通过查找页表,就可以找到每页所
对应的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。

三、分段存储管理
1.分段基本原理
作业的地址空间被划分为若干段,每个段定义了一组逻辑信息。每个段都有自己的名字,都是
从零开始编址的一段连续的地址空间,段的长度由相应逻辑信息组的长度决定,因而各段长度不等,
整个作业的地址空间是二维的。分段系统中地址结构如图2-4所示,其逻辑地址由段号(名)和段
内地址两部分组成,在该地址结构中,允许一个作业最多能有256个段,每个段的最大长度为64K。

2.地址变换机构
在分段式存储管理系统中,为每个段分配一个连续的分区,而进程中的各个段可以离散地
分配到内存中不同的分区中。在系统中为每个进程建立一张段映射表,简称为“段表”,如图
2-5所示。进程在执行中,通过查段表来找到每个段所对应的内存区。所以说,段表实现了从逻
辑段到物理内存区的映射。
3.分页和分段的主要区别
 分页对用户是不透明的,分段对用户是透明的。页是信息的物理单位,分页仅仅是由于系统管理
的需要,而不是用户的需要;而段是信息的逻辑单位,它含有一组具有相对完整意义的信息,是
出于用户的需要。
 分段的大小任意,分页固定。分页的长度固定,分页系统把逻辑地址划分为页号和页内地址两部
分的功能,由机器硬件实现;而段的长度却不固定,由用户在编程时确定,或由编译程序在对源
程序进行编译时,根据信息的性质来划分。
 分页地址空间是一维的,而分段是二维的。分段存储管理有利于模块的动态链接、装入和分段共享。

四、虚拟存储管理
1.局部性原理
它是虚拟存储技术的理论基础,是指程序的执行往往呈现出高度的局限性,即程序执时往
往会不均匀地访问内存储器。程序的局限性表现为:
 时间局部性:若一条指令被执行,则在不久的将来,它可能再被执行。

 空间局部性:一旦一个存储单元被访问,那它附近的单元也将很快被访问。
2.虚拟存储器的定义
利用大容量的外存(通常是高速硬盘)来扩充内存,产生一个比有限的实际内存空间大得
多的、逻辑的虚拟内存空间,以便能够有效地支持多道程序系统的实现和大型作业运行的需要,
从而增强系统的处理能力。当进程要求运行时,不是将它的全部信息装入内存,而是将其一部
分先装入内存,另一部分暂时留在外存。进程在运行过程中,要使用的信息不在内存时,发生
中断,由操作系统将它们调入内存,以保证进程的正常运行。从用户角度看,该系统所具有的
主存容量,将比实际主存容量大得多,人们把这样的存储器称为虚拟存储器。
虚拟存储器不仅是解决主存容量和存取速度矛盾的一种方法,而且也是管理存储设备的有
效方法。
3.虚拟存储器的实现
请求分页系统:在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟
存储系统。请求分页机制是在纯分页的页表机制上形成的,由于只将应用程序的一部分调入主存,
还有一部分仍在磁盘上,故需在页表中再增加若干项,如状态位、访问字段、辅存地址等供程序(数
据)在换进、换出时引用。在请求分页系统中,每当所要访问的页面不在主存时,便要产生一个缺
页中断,请求操作系统将所缺页调入主存。与一般中断的主要区别在于:缺页中断在指令执行期间
产生和处理中断信号,而一般中断在一条指令执行完后检查和处理中断信号。缺页中断返回到该指
令的开始重新执行该指令,而一般中断返回到该指令的下一条指令执行。
请求分段系统:在分段系统的基础上,增加了请求调段和分段置换功能所形成的段式虚拟
存储系统。
4.替换算法
(1)最佳置换算法OPT
OPT是一种理论化的算法。该算法淘汰在访问串中将来再也不出现的或是在最长时间内不再
访问的页。这样,淘汰掉的页将不会造成因需要访问该页又需要把它调入的现象。这种最佳策略
本身不是一种实际的方法,它的理论价值在于:用OPT算法的缺页率去评价其他算法的优劣。
(2)先进先出算法FIFO
FIFO总是选择作业中在主存驻留时间最长(即最老)的一页淘汰,即先进入主存的页先退
出主存。其理由是,最早调入主存的页,其不再被使用的可能性比最近调入主存的页要大。
(3)最近最久未使用置换算法LRU
LRU选择在最近一段时间内最久不用的页予以淘汰。这是最常用的页面置换算法。
(4)最近未用置换算法NUR
LRU是将最近一段时间未引用过的页面换出,它是一种LRU的近似算法。
怎么考
【试题2-13】 2008 年5 月真题1
内存采用段式存储管理有许多优点,但 (1) 不是其优点。

A. 分段是信息逻辑单位,用户不可见 B. 各段程序的修改互不影响
C. 地址变换速度快、内存碎片少 D. 便于多道程序共享主存的某些段
解 析:内存的段式管理有许多优点。例如,它支持程序的模块化设计和并行编程的要求,可以使
各段程序的修改互不影响,便于多道程序共享某些主存的某些段。但这种管理方式地址变换速度慢,内存
碎片多。【答 案:(1)C】
【试题2-14】 2007 年11 月真题10
页式虚拟存储系统的逻辑地址是由页号和页内地址两部分组成,地址变换过程如下图所示。假定页
面的大小为8K,图中所示的十进制逻辑地址9612经过地址变换后,形成的物理地址a应为十进制 (10) 。

A. 42380 B. 25996 C. 9612 D. 8192
解 析:在页式存储管理中,逻辑地址为页内地址。本题中,页面的大小为8KB,则页内有效地址
的范围为0~8191。本题中逻辑地址为9612,则有效地址为:9612除以8192取余为1420。由题目中的地址变
换过程图可知,逻辑地址9612在第1页,该页在内存中对应的物理块号为3,因此,可以计算物理地址a为:
8192×3+1420=25996。【答 案:(10)B】
【试题2-15】
页式存储系统的逻辑地址是由页号和页内地址两部分组成。假定页面的大小为4K,地址变换过程如
图所示,图中逻辑地址用十进制表示。

图中有效地址经过变换后,十进制物理地址a应为 (1) 。
A.33220 B.8644 C.4548 D.2500
解 析:在页式存储管理中,逻辑地址除以页面的大小,商为页号,余数为页内地址。在本题中,
页面的大小为4K(4096),用逻辑地址8644除以4096,商为2,余数为452。查找页表可知,物理块号为8,
因此十进制物理地址a应为8×4096+452=33220,答案选A。【答 案:(1)A】
【试题2-16】
段式和页式存储管理的地址结构很类似,但是它们之间有实质上的不同,表现为 (1) 。
A.页式的逻辑地址是连续的,段式的逻辑地址可以不连续
B.页式的地址是一维的,段式的地址是二维的
C.分页是操作系统进行的,分段是用户确定的

D.页式采用静态重定位方式,段式采用动态重定位方式
解 析:各页可以分散存放在主存,每段必须占用连续的主存空间,选项A不正确;分页和分段都是
操作系统确定和进行的,选项C也不正确;页式和段式都是采用动态重定位方式,选项D也不正确。正确
答案选B。【答 案:(1)B】
【试题2-17】
在下列存储管理方案中, (1) 是解决内存碎片问题的有效方法。
A.单一连续分配 B.固定分区 C.可变分区 D.可重定位分区
解 析:解决内存碎片问题的一种有效的方法是移动内存中所有进程的存储区,使它们相互邻接并
位于内存的某一端,而把全部空闲区留在另一端,形成一个大的空闲分区,这种技术为“紧凑”。由于经
过紧凑后的用户进程在内存中的位置发生了变化,必须采用动态重定位的方法,将进程中相对地址转换为
物理地址的步骤推迟到进程执行时进行。【答 案:(1)D】
【试题2-18】
当存储器采用段页式管理时,主存被划分为定长的 (1) ,程序按逻辑模块分成 (2) 。在
某机器的多道程序环境下,每道程序还需要一个 (3) 作为用户标志号,每道程序都有对应的 (4) 。
一个逻辑地址包括 (3) x、段号s、页号p和页内地址d四个部分。
设逻辑地址长度分配如下,其中x、s、p、d均以二进制数表示:

其转换后的物理地址为 (5)
(1)A.段 B.页 C.区域 D.块
(2)A.区域 B.页 C.块 D.段
(3)A.模块号 B.区域号 C.基号 D.区域
(4)A.一个段表和一个页表 B.一个段表和一组页表
C.一组段表和一个页表 D.一组段表和一组页表
(5)A.x*220+s*214+p*211+d B.(((x)+s)+p)+d
C.(((x)+s)+p)*211+(d) D.(((x)+s)+p)*211+d
注:式中(Y)表示地址为Y的单元的内容
解 析:段页式存储管理是分页存储管理和分段存储管理两种方式的结合。在段页式存储管理中,
对于用户程序分采用段式管理方式,即将程序分成若干个段,并为每个段赋予一个段号,再把每个段分成
若干个大小固定的页。对于内存空间的管理仍然和页式管理一样,将其分成若干个和页面大小相同的物理
块,并且对内存的分配是以物理块为单位的。由此可见,空(1)和(2)分别选B和D。
在多道程序环境下,为区分不同程序,每道程序都应有一个基号,(3)的答案选C。
在多道程序环境下,每道程序可以有多个段,为了管理内存分配与释放、缺段处理、存储保护和地
址变换等功能,系统必须为每道程序建立一张段表。此外,因为一个段又被划分成了若干页,每个段又必
须建立一张页表以把段中的虚页变换成内存中的实际页面。也就是说每道程序都有对应的一个段表和一组
页表,(4)的答案选B。
段页式存储管理系统中,逻辑地址转换成物理地址包括以下几步:①由基号x得到段表的首地址为(x);
②由段表首地址(x)和段号s得到该段的页表首地址为((x)+s);③由页表首地址为((x)+s)和页号p得到存放在
主存中的页架号为(((x)+s)+p);④由于页内地址d其占用11位,因此在主存中页架的首地址为(((x)+s)+p)×
211;⑤由页架的首地址(((x)+s)+p)×211和页内地址d得到物理地址为(((x)+s)+p)*211+d。(5)的答案选D。
【答 案:(1)B (2)D (3)C (4)B (5)D】

【试题2-19】
在计算机系统中,构成虚拟存储器 (1) 。
A.只需要一定的硬件资源便可实现 B.只需要一定的软件即可实现
C.既需要软件也需要硬件方可实现 D.既不需要软件也不需要硬件
解 析:虚拟存储器和高速缓存(Cache)的实现方式是不同的,Cache是由硬件自动完成的,而虚
拟存储器是操作系统自动实现存储信息的调度和管理,但需要借助磁盘等辅助存储器来扩大主存容量,因
此需要硬件资源的配合,答案选C。【答 案:(1)C】
【试题2-20】
虚存页面调度算法有多种,下列 (1) 调度算法不是其页面调度算法。
A.后进先出 B.先进先出 C.最近最少使用 D.随机选择
解 析:虚拟存储技术的理论基础是程序的局部性理论,“后进先出”不符合这个思想,答案选A,
其他三个选项都是虚拟存储器的页面调度算法。【答 案:(1)A】

【试题2-21】
在请求分页管理中,若采用先进先出(FIFO)页面置换算法,可能会产生“FIFO异常”,“FIFO异
常”指的是 (1) 。
A.频繁地出页入页的现象
B.分配的页面数增加,缺页中断的次数也可能增加
C.进程交换的信息量过大导致系统工作区不足
D.分配给进程的内存空间不足使进程无法正常工作
解 析:当内存中需要进行页面置换时,先进先出页面置换算法选择在主存驻留时间最长的页面进
行置换。在使用该算法时,在未给进程分配足够的页面数时,有时会出现进程的页面数增加,缺页次数反
而增加的异常现象。由于这种现象是Belady发现的,所以这种奇怪的现象也称为“Belady异常”。这种异
常只会在先进先出页面置换算法出现。【答 案:(1)B】
【试题2-22】
在虚拟分页存储管理系统中,若进程访问的页面不在主存,且主存中没有可用的空闲块时,系统正
确的处理顺序为 (1) 。
A.决定淘汰页→页面调出→缺页中断→页面调入
B.决定淘汰页→页面调入→缺页中断→页面调出
C.缺页中断→决定淘汰页→页面调出→页面调入
D.缺页中断→决定淘汰页→页面调入→页面调出
解 析:在虚拟分页存储管理系统中,若内存已满,无法装入新的页面时,发生缺页中断,系统根
据页面置换算法,确定被淘汰页,将其调回外存,再将要访问的页面从外存调入刚刚腾出来的内存位置,
完成缺页中断的处理。【答 案:(1)C】


http://www.huachu.com.cn/read/readbookinfo.asp?sectionid=1000003747

--------------------------------------------

Http之Get/Post请求区别
1.HTTP请求格式:

<request line>

<headers>

<blank line>

[<request-body>]

在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。

2.GET与POST区别   最主要的区别是get可以克服跨域访问的问题,post不行

HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST.

HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GET和HTTP-POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,而响应则是由一系列HTTP应答头和应答数据组成,如果请求成功则返回应答。
  HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。
  与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。

(1)get是从服务器上获取数据,post是向服务器传送数据。

(1)   在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。

(2) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

(2)   GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

(3)   安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

注:所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。

下面举一个简单的例子来说明它们的区别:

<!-分别通过get和post方式提交表单-->
<FORM ACTION="getpost.asp" METHOD="get">
<INPUT TYPE="text" NAME="Text" VALUE="http://wxf0701.cnblogs.com//>
<INPUT TYPE="submit" VALUE="Get方式"></INPUT>
</FORM>
<BR>
<FORM ACTION="getpost.asp" METHOD="post">
<INPUT TYPE="text" NAME="Text" VALUE="http://wxf0701.cnblogs.com/>
<INPUT TYPE="submit" VALUE="Post方式"></INPUT>
</FORM>
<BR>

<% If Request.QueryString("Text") <> "" Then %>
通过get方式传递的字符串是: "<B><%= Request.QueryString("Text") %></B>"<BR>
<% End If %>

<% If Request.Form("Text") <> "" Then %>
通过Post方式传递的字符串是: "<B><%= Request.Form("Text") %></B>"<BR>
<% End If %>

http://www.cnblogs.com/wxf0701/archive/2008/08/17/1269798.html


----------------------
# 从HTTP GET和POST的区别说起
Random Thoughts, WebDev @ 04 May 2010, “10 Comments”
在推特上抱怨面试时问HTTP GETE和POST的区别得到回答都不满意,有人不清楚,当时只回复了看 RFC2616。趁有空说说

面试时得到的回答大多是:POST是安全的,因为被提交的数据看不到,或者被加密的,其它的还有GET的时候中文出现乱码(在地址栏里),数据最大长度限制等等。

说 POST 比 GET 安全肯定是错的,POST跟GET都是明文传输,用httpfox等插件,或者像WireShark 等类似工具就能观察到。

POST和GET的差别其实是很大的。语义上,GET是获取指定URL上的资源,是读操作,重要的一点是不论对某个资源GET多少次,它的状态是不会改变的,在这个意义上,我们说GET是安全的(不是被密码学或者数据保护意义上的安全)。因为GET是安全的,所以GET返回的内容可以被浏览器,Cache服务器缓存起来(其中还有很多细节,但不影响这里的讨论)。

而POST的语意是对指定资源“追加/添加”数据,所以是不安全的,每次提交的POST,参与的代码都会认为这个操作会修改操作对象资源的状态,于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会缓存POST请求返回内容。

很遗憾到目前为止没有应聘者能够提到这一点。我猜测这背后的原因大概有两个,一是也许大多数人往往(我也一样)满足于只要完成任务就好,不管用哪个,表单提交了,数据处理了,内容显示或者重新定向到另外一个页面,就算完成了一个任务,从任务表里划掉,结束。而且对大部分项目(OA, CRM, MIS)的大部分情况下,用哪个似乎都可以。

同时,在被商业机构在媒体和书籍上宣传兜售的WS-*概念和使用集成开发环境提供的“方便”的代码生成工具后,“了解”到所有Web服务调用都是通过POST,更潜意识里确定了POST和GET是一样的,而且GET能做的,POST都能做,POST简直就是GET++嘛。自然,能用POST就用POST,不必在乎两者的差别了。

这又让我想起最近学到的一个概念: Radius Of Comprehension,理解的半径:

当学习概念A的时候,需要先了解概念B,而概念C又是理解B的前提。当B和C都是新的需要学习的概念时,可以说A的理解半径是2,如图:

A --> B --> C
|--1--|--2--|
在学习Web开发时,接触到GET和POST时,“理解的半径”可能包涵:

POST vs. GET
     |---> Conditional GET -> ETag -> Cache
     |         `--> Status Code
     `---> HTTP的方法 --> URL
往往因为仅仅满足于完成手上被要求的任务,或者懒于问一个为什么,我们就把自己的理解半径设置成零,那么就学不到更深入的东西,也因此仅仅知道POST和GET不同,而不再会了解不同在哪里,什么是Conditional GET和缓存header等概念。

从一个简单的面试问题谈到这,貌似小题大作了,写到哪算哪吧。

<UPDATE>
看到Fenng Buzz 了这篇文字,引起一些评论,因此在这再讨论两个概念: 安全的(Safe)和幂等的(Idempotent)。

安全的是指没有明显的对用户有影响的副作用(包括修改该资源的状态)。HTTP方法里的GET和HEAD都是安全的。

幂等的是指一个方法不论多少次操作,结果都是一样。PUT(把内容放到指定URL),DELETE(删除某个URL代表的资源),虽然都修改了资源内容,但多次操作,结果是相同的,因此和HEAD,GET一样都是幂等的。

所以根据HTTP协议,GET是安全的,也是幂等的,而POST既不是安全的,也不是幂等的。

http://www.yining.org/2010/05/04/http-get-vs-post-and-thoughts/





















 








  • 大小: 4.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics