POST方式发送ajax请求详解

POST方式发送ajax请求详解

原文地址http://04101334.iteye.com/blog/637695

        在开始讲解之前,我假设你已经对ajax的基本原理有一定的理解,如果还有哪位朋友不怎么了解的话,

请点击这里:http://04101334.iteye.com/blog/631257

post和get

        首先我们先讲解下post和get发送方式的特点, GET 方法提交数据不安全,数据置于请求行,客户端地址栏可见; GET 方法提交的数据大小限制在255 个字符之内。为了验证以上说法,我们接下来做个试验。首先看如下代码:

 

Html代码  收藏代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <html>  
  3. <head>  
  4. <title>test-get_post</title>  
  5. </head>  
  6. <body>  
  7. <form name="Login" method="get" action="test.jsp">  
  8. User ID: <input type="text" name="name"><br>  
  9. Password: <input type="password" name="password">  
  10. <input type="HIDDEN" name="from" value="welcome">  
  11. <input type="submit" value="submit">  
  12. </form>  
  13. </body>  
  14. </html>  

 接着我们输入一些数据,然后点击submit,如下图:


                                               图1-1
 接下来我们再来看一下提交的这个http请求的详细信息:


                                                                      图1-2

 由于上图我们可以看出,使用get方式发送的http请求,参数都是直接跟在URL后面清晰可见的,而且我们也不难看出,该http请求的body部分也是空的,只有head部分显示了一个http的基本信息。关于 GET 方法提交的数据大小是否限制在255 个字符之内,这里就不再做实验了,大家可以自己去实验。

 

接下来我们来看看POST 方法是如何提交数据的,POST方法提交的数据置于消息主体内,客户端不可见, POST 方法提交的数据大小没有限制。我们对以上html稍做修改如下:

Html代码  收藏代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <html>  
  3. <head>  
  4. <title>test-get_post</title>  
  5. </head>  
  6. <body>  
  7. <form name="Login" method="Post" action="test.jsp">  
  8. User ID: <input type="text" name="name"><br>  
  9. Password: <input type="password" name="password">  
  10. <input type="HIDDEN" name="from" value="welcome">  
  11. <input type="submit" value="submit">  
  12. </form>  
  13. </body>  
  14. </html>  

 接着我们输入一些数据,然后点击submit,如下图:

图1-3

 

接下来我们再来看一下提交的这个http请求的详细信息:


图1-4

由上图我们可以看出,使用post方式发送的http请求,参数不是跟在URL后面的,而是存放在http请求的body部分的,关于请求参数在http请求body中存放的形式类似get方式,见下图:


图1-5

 ②进入正题

在简单的讲述了get和post方式的特点后,我们正式进入正题,即如何以post形式向server发送ajax请求,在发送请求之前,第一个我们需要解决的问题就是如何去搜集并组织指定form表单中的数据。

 

一般来说form中存放数据的控件主要是<input>,而这个<input>type很多,如‘submit’,‘hidden’, ‘password’, ‘text’,‘checkbox’, ‘radio’等。因此第一步我们要做的就是先写一个方法,将将form中各种类型的<input>将数据值给抠出来。具体见如下代码:

Js代码  收藏代码
  1. //获取指定form中的所有的<input>对象  
  2. function getElements(formId) {  
  3.     var form = document.getElementById(id);  
  4.     var elements = new Array();  
  5.     var tagElements = form.getElementsByTagName('input');  
  6.     for (var j = 0; j < tagElements.length; j++)  
  7.         elements.push(tagElements[j]);  
  8.     return elements;  
  9. }  
 

接着我们需要获取每个input对象的name-value对,代码如下:

Js代码  收藏代码
  1. function inputSelector(element) {  
  2.   if (element.checked)  
  3.      return [element.name, element.value];  
  4. }  
  5.     
  6. function input(element) {  
  7.     switch (element.type.toLowerCase()) {  
  8.       case 'submit':  
  9.       case 'hidden':  
  10.       case 'password':  
  11.       case 'text':  
  12.         return [element.name, element.value];  
  13.       case 'checkbox':  
  14.       case 'radio':  
  15.         return inputSelector(element);  
  16.     }  
  17.     return false;  
  18. }  
 

接着我们就可以将所有这些input对象中的name-value对以图1-5中POSTDATA那样的格式组织起来。代码如下:

 

Js代码  收藏代码
  1. function serializeElement(element) {  
  2.     var method = element.tagName.toLowerCase();  
  3.     var parameter = input(element);  
  4.   
  5.     if (parameter) {  
  6.       var key = encodeURIComponent(parameter[0]);  
  7.       if (key.length == 0) return;  
  8.   
  9.       if (parameter[1].constructor != Array)  
  10.         parameter[1] = [parameter[1]];  
  11.         
  12.       var values = parameter[1];  
  13.       var results = [];  
  14.       for (var i=0; i<values.length; i++) {  
  15.         results.push(key + '=' + encodeURIComponent(values[i]));  
  16.       }  
  17.       return results.join('&');  
  18.     }  
  19.  }  
  20.     
  21. function serializeForm(formId) {  
  22.     var elements = getElements(formId);  
  23.     var queryComponents = new Array();  
  24.   
  25.     for (var i = 0; i < elements.length; i++) {  
  26.       var queryComponent = serializeElement(elements[i]);  
  27.       if (queryComponent)  
  28.         queryComponents.push(queryComponent);  
  29.     }  
  30.   
  31.     return queryComponents.join('&');  
  32. }  
 

 

接下来我们来创建一个form表单,里面包含各种input控件,代码如下:

Html代码  收藏代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <%@page import="java.util.Enumeration"%>  
  3. <html>  
  4. <head>  
  5. <title>test-get_post</title>  
  6. <script src="demo.js" type="text/javascript"></script>  
  7. <script type="text/javascript">  
  8. <!--//  
  9. var request = getXMLHttpRequest();  
  10. function getFormInfo() {  
  11.     var postBody = serializeForm('Login');  
  12.     var url = document.getElementById('Login').action;  
  13.     request.open("post", url, true);  
  14.     request.onreadystatechange = updatePage;  
  15.     //  
  16.     request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');  
  17.     request.send(postBody);  
  18. }  
  19.   
  20. function updatePage() {  
  21.     if (request.readyState == 4) {  
  22.     if (request.status == 200) {  
  23.     var response = request.responseText;  
  24.         alert(response);  
  25.     } else  
  26.         alert("status is " + request.status);  
  27.     }  
  28. }  
  29.   
  30. //-->  
  31. </script>  
  32. </head>  
  33. <body>  
  34. <form id="Login" name="Login" method="post" action="result.jsp">  
  35. User ID: <input type="text" name="name"><br>  
  36. Password: <input type="password" name="password"><br>  
  37. sex:<input type="radio" name="sex" value="man"> man 
  38. <input type="radio" name="sex" value="woman"> woman<br>  
  39. interest:<input type="checkbox" name="interest" value="piu">PIU 
  40. <input type="checkbox" name="interest" value="dss">DSS 
  41. <input type="checkbox" name="interest" value="ddr">DDR<br>  
  42. <input type="hidden" name="from" value="welcome"><br>  
  43. <input type="button" name="submit" value="submit" onclick="getFormInfo();">  
  44. </form>  
  45. </body>  
  46. </html>  

 

另外值得注意的是,上述代码这句:

request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

 

非常重要,没有这句的话,server就无法正常读取postdata中的任何数据,因为如果在 HTTP 流中传递空白和标点之类的字符,则它们在接收端可能会被错误地解释。URL 编码将 postdata 中不允许使用的字符转换为等效字符实体;URL 解码会反转此编码过程。例如,当嵌入到要在 URL 中传输的文本块中时,字符 < 和 > 分别被编码为 %3c 和 %3e。

接着我看一下接收端result.jsp的代码:

Html代码  收藏代码
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2. <%@page import="java.util.Enumeration"%>  
  3. <%@ page language="java" contentType="text/xml; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>  
  4. <%  
  5.     String name = request.getParameter("name");  
  6.     String pwd = request.getParameter("password");  
  7.     String sex = request.getParameter("sex");  
  8.     String[] interest = request.getParameterValues("interest");  
  9.     String from = request.getParameter("from");  
  10. %>  
  11.   
  12. <validation>  
  13.     <name><%=name %></name>  
  14.     <password><%=pwd %></password>  
  15.     <sex><%=sex %></sex>  
  16.     <interest><%  
  17.         for (int i=0; i<interest.length; i++)  
  18.             out.print(interest[i] + " ");  
  19.     %></interest>  
  20.     <from><%=from %></from>  
  21. </validation>  

 最后,我们点击submit,看一下输出结果:



              到这里就差不多结束了,希望这篇文章能给大家带来一些帮助和启发,谢谢大家观赏。最后附上源码,源码大家去博主原文地址下载:http://04101334.iteye.com/blog/637695


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值