`
sumongh
  • 浏览: 222959 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

AJAX进阶学习二:GET 和 POST 配合表单

阅读更多

    讲到这里首先必须要介绍一下 HTTP 协议和 GET, POST 的工作方式.

    当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.
    随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为:

< Method > < URL > < HTTP Version > <\n>
{ <Header>:<Value> <\n>}*
<\n>
{ Entity Body }

    请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等.
在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.
    在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个\n之后是请求消息的消息实体(Entity Body).
     Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:

< HTTP Version> <Status Code> [<Message>]<\n>
{ <Header>:<Value> <\n> } *
<\n>
{ Entity Body }

    应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:

  • 1XX 保留
  • 2XX 表示成功
  • 3XX 表示URL已经被移走
  • 4XX 表示客户错误
  • 5XX 表示服务器错误
  • 例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.
        在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.
        下面是一个应答消息的例子:

    HTTP/1.0 200 OK
    Date: Moday,07-Apr-97 21:13:02 GMT
    Server:NCSA/1.1
    MIME_Version:1.0
    Content_Type:text/html
    Last_Modified:Thu Dec 5 09:28:01 1996
    Coentent_Length:3107

    <HTML><HEAD><TITLE>...</HTML>

    那么 GET 和 POST 有什么区别? 区别就是一个在 URL 请求里面附带了表单参数和值, 一个是在 HTTP 请求的消息实体中. 用下面的例子可以很容易的看到同样的数据通过GET和POST来发送的区别, 发送的数据是 username=张三 :

     GET 方式, 浏览器键入 http://localhost?username=张三

    GET /?username=%E5%BC%A0%E4%B8%89 HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
    Host: localhost
    Connection: Keep-Alive

    POST 方式:

    POST / HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
    Accept-Language: zh-cn
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
    Host: localhost
    Content-Length: 28
    Connection: Keep-Alive

    username=%E5%BC%A0%E4%B8%89

    比较一下上面的两段文字, 您会发现 GET 方式把表单内容放在前面的请求头中, 而 POST 则把这些内容放在请求的主体中了, 同时 POST 中把请求的 Content-Type 头设置为 application/x-www-form-urlencoded. 而发送的正文都是一样的, 可以这样来构造一个表单提交正文:

    encodeURIComponent(arg1)=encodeURIComponent(value1)&encodeURIComponent(arg2)=encodeURIComponent(value2)&.....

    注: encodeURIComponent 返回一个包含了 charstring 内容的新的 String 对象(Unicode 格式), 所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。 例如,空格返回的是 "%20" 。 字符的值大于 255 的用 %uxxxx 格式存储。参见 JavaScript 的 encodeURIComponent() 方法.

    下面就讨论一下如何在 JavaScript 中执行一个 GET 或者 POST 请求. 如果您用过 Java, 那么您可能熟悉下列的用 java.net.URLConnection 类进行 POST 操作的代码(参考 Java Tip 34: POSTing via Java ):
     

    URL url;
    URLConnection urlConn;
    DataOutputStream printout;
    // URL of CGI-Bin or jsp, asp script.
    url = new URL ("somepage");
    // URL connection channel.
    urlConn = url.openConnection();
    // ......
    // No caching, we want the real thing.
    urlConn.setUseCaches (false);
    // Specify the content type.
    urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    // Send POST output.
    printout = new DataOutputStream (urlConn.getOutputStream ());
    String content = "name=" + URLEncoder.encode ("Buford Early") + "&email=" + URLEncoder.encode ("buford@known-space.com");
    printout.writeBytes (content);
    printout.flush ();
    printout.close ();

    以上的代码向 somepage 发送了一次 POST 请求, 数据为 name = Buford Early, email = buford@known-space.com.
    JavaScript 来执行 POST/GET 请求是同样的原理, 下面的代码展示了分别用 XMLHttpRequest 对象向 somepage 用 GET 和 POST 两种方式发送和上例相同的数据的具体过程:
    GET 方式

    var postContent =
    "name=" + encodeURIComponent("Buford Early") + "&email=" + encodeURIComponent("buford@known-space.com");
    xmlhttp.open("GET", "somepage" + "?" + postContent, true);
    xmlhttp.send(null);

    POST 方式

    var postContent =
    "name=" + encodeURIComponent("Buford Early") + "&email=" + encodeURIComponent("buford@known-space.com");
    xmlhttp.open("POST", "somepage", true);
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.send(postContent);

    至此希望你已经能够理解如何用 JavaScript 中的 XMLHttpRequest 对象来执行 GET/POST 操作, 剩下的工作就是您如何来构造这些提交的参数了, 最后我给出一个将现有的 form 提交代码修改为异步的 AJAX 提交的代码(注意目前作者还不知道如何让 file 上传表单域也能异步上传文件). 首先请看两个 JavaScript 函数:

    // form - the form to submit
                // resultDivId - the division of which to display result text in, in null, then
                // create an element and add it to the end of the body
                function ajaxSubmitForm(form, resultDivId) {
                var elements = form.elements;// Enumeration the form elements
                var element;
                var i;
                var postContent = "";// Form contents need to submit
                for(i=0;i<elements.length;++i) {
                  	var element=elements[i];
                if(element.type=="text" || element.type=="textarea" || element.type=="hidden") {
                postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
                }
                else if(element.type=="select-one"||element.type=="select-multiple") {
                var options=element.options,j,item;
                for(j=0;j<options.length;++j){
                item=options[j];
                if(item.selected) {
                        	postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(item.value) + "&";
                		}
                }
                } else if(element.type=="checkbox"||element.type=="radio") {
                if(element.checked) {
                        	postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
                		}
                	} else if(element.type=="file") {
                		if(element.value != "") {
                			postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
                		}
                	} else {
                			postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
                	}
                }
                alert(postContent);
                ajaxSubmit(form.action, form.method, postContent);
                }
                // url - the url to do submit
                // method - "get" or "post"
                // postContent - the string with values to be submited
                // resultDivId - the division of which to display result text in, in null, then
                // create an element and add it to the end of the body
                function ajaxSubmit(url, method, postContent, resultDivId)
                {
                var loadingDiv = document.getElementById('loading');
                	// call in new thread to allow ui to update
                	window.setTimeout(function () {
                		loadingDiv.innerText = "Loading....";
                		loadingDiv.style.display = "";
                	}, 1);
                	// code for Mozilla, etc.
                	if (window.XMLHttpRequest)
                	{
                		xmlhttp=new XMLHttpRequest();
                	}
                	// code for IE
                	else if (window.ActiveXObject)
                	{
                		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                	}
                	if(xmlhttp) {
                		xmlhttp.onreadystatechange = function() {
                			// if xmlhttp shows "loaded"
                			if (xmlhttp.readyState==4)
                			{
                				if(resultDivId) {
                					document.getElementByID(resultDivId).innerHTML = xmlhttp.responseText;
                				} else {
                var result = document.createElement("DIV");
                result.style.border="1px solid #363636";
                result.innerHTML = xmlhttp.responseText;
                document.body.appendChild(result);
                				}
                			  	loadingDiv.innerHTML =
                				  "Submit finnished!";
                			}
                		};
                		if(method.toLowerCase() == "get") {
                			xmlhttp.open("GET", url + "?" + postContent, true);
                			xmlhttp.send(null);
                		} else if(method.toLowerCase() == "post") {
                			xmlhttp.open("POST", url, true);
                			xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                			xmlhttp.send(postContent);
                		}
                	} else {
                loadingDiv.innerHTML =
                		  "Can't create XMLHttpRequest object, please check your web browser.";
                	}
                }

    函数 ajaxSubmitForm 将表单要提交的内容进行封装, 然后调用 ajaxSubmit 函数来执行真正的异步提交, 表单提交后所返回的结果则显示在给定的 DIV 容器中或者没有指定参数时用 DOM 对象动态生成一个 DIV 容器来显示结果并添加到页面末尾. 这样, 对原来的表单只需要改动一个地方就可以将原来的表单提交改为异步模式, 即在 form 标签里加入: onSubmit="ajaxSubmitForm(this);return false;" 即可, return false 确保表单不会被浏览器同步提交. 完整的例子请看这里.

    分享到:
    评论
    1 楼 chinaemerson 2009-11-28  
    看了您这篇文章,对我帮助很大!谢谢,不介意我收藏吧~

    相关推荐

      Web应用安全:HTTP协议GET和POST的使用区别实验.docx

      通过ajax实例深入理解http协议之post方法。 二、实验用到的工具软件 firefox的firebug插件 抓包工具wireshark 三、实验内容与步骤 1)正常情况下的html表单提交 html源码如下: &lt;!DOCTYPE HTML&gt; 测试 ;charset=utf-...

      PHP+Jquery+AJAX POST,GET提交表单并接收返回

      PHP+Jquery+AJAX POST,GET提交表单并接收返回

      Jquery中ajax提交表单几种方法(get、post两种方法)

      在jquery中ajax提交表单有post与get方式,在使用get方式时我们可以直接使用ajax 序列化表单$( 表单ID) serialize();就行了,下面我来介绍两个提交表单数据的方法。$get方式提交表单get() 方法通过远程HTTP ,下面我...

      AJAXCDR:利用 Flash 完美解决 JavaScript 和 AJAX 跨域 HTTP POST/GET 表单请求

      JavaScript 和 AJAX 跨域访问分为两大类,一是本域和子域的交互,二是本域和其他域的交互。  一、本域和子域的交互:www.s135.com 和 blog.s135.com  二、本域和其他域的交互:blog.s135.com 和 api.bz  本域和...

      ajax中get和post的说明及使用与区别

      谈Ajax的Get和Post的区别 Get方式: 用get方式可传送简单数据,但大小一般限制在1KB下,数据追加到url中发送(http的header传送),也就是说,浏览器将各个表单字段元素及其数据按照URL参数的格式附加在请求行中的...

      实验五 AJAX开发及JSP验证码

      四、实验内容 1.在实验四基础上使用AJAX技术实现异步登录功能。... open("请求方式GET/POST","页面地址",true):与服务器建立连接 send():发送请求,如果是post提交方式,send("参数名=参数值");

      nodejs之get/post请求的几种方式小结

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

      使用jQuery的ajax方法向服务器发出get和post请求的方法

      假设有个网站A,它有一个简单的输入用户名的页面,界面上有两个输入框,第一个输入框包含在一个form表单里用来实现form提交,第二个输入框是单独的、没有包含在form里,下面就用这两个输入框来学习下jQuery的ajax。...

      Ajax提交post请求案例分析

      前言:博主之前有篇文章是快速入门Ajax ,主要是利用Ajax做简单的get请求,今天给大家分享一篇利用Ajax提交post请求,以及使用post时需要注意的地方,还是以案例的方式告诉大家。 案例: 注册表单 文件结构图: 06-...

      jQuery中$.ajax()和$.getJson()同步处理详解

      一、前言 为什么需要用到同步,因为有时候我们给一个提交...type: 请求方式(post或get)默认为get。 timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。 async:默认设置为true,所有请求均为异步请求。同

      ajax请求post和get的区别以及get post的选择

      1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来 2.使用Get请求发送数据量小,Post请求发送数据量大 3.get请求需注意缓存问题,post请求不需担心这个问题 Get方式: 用get方式可传送简单数据,但大小...

      Ajax请求session超时处理流程

      ajax post 表单数据处理: 当客户端ajax提交表单超时, 弹出一个登录框,并加一个背景层下面的整个浏览器. 当用户输入username and password登录成功后,去掉登录框和背景层.这时用户可以继续操作. 登录...

      AJAX提交表单数据实例分析

      本文实例讲述了AJAX提交表单数据的方法。分享给大家供大家参考。具体如下: var TINY={}; TINY.ajax = function() { return { /** * @param string type 请求类型,post,get(目前只实现了这两种) * @param ...

      Django之提交表单与前后端交互的方法

      1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请求 GET 请求过程 前端通过ajax发起GET请求,json格式数据 var data =...

      ajax中send的用法

      一般情况下,使用Ajax提交的参数多是些简单的字符串,可以直接使用GET方法将要提交的参数写到open方法的url参数中,此时send方法的参数为null。 例如 : var url = "login.jsp?user=XXX&pwd=XXX"; ...

      Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作

      本教程基于Laravel 5.4 ...Route::get('post/create', 'PostController@create'); Route::post('post/save', 'PostController@save'); 然后在项目根目录下运行 Artisan 命令创建控制器 PostController : php art

      django中的ajax组件教程详解

      Ajax(Asynchronous Javascript And XML)翻译成英文就是“异步Javascript和XML”。即用Javascript语言与服务器进行异步交互,传输的数据为XML,(现在使用更多的是json数据)。 向服务器发送请求的途径 1.浏览器地址...

      Django 使用Ajax进行前后台交互的示例讲解

      为了方便前后台交互,利用了Ajax的GET和POST方法分别进行数据的获取和提交。 代码如下: &lt;!--利用获取的数据进行表单内容的填充--&gt; [removed] $(#soft_id).change(function(){ var softtype=$(#soft_id).find...

      JQuery的Ajax中Post方法传递中文出现乱码的解决方法

      今天在做项目时,需要用到Ajax,之前我在用GET方式传递中文参数时,只需要在后台程序中设置页面编码为GB2312即中文能正常显示,可是这次由于表单项目较多,不适合用GET方式传递,只能用POST方式,但发现后台程序中...

    Global site tag (gtag.js) - Google Analytics