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


Posted in Javascript onJanuary 13, 2017

打算写个ajax系列的博文,主要是写给自己看,学习下ajax的相关知识和用法,以更好的在工作中使用ajax。

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

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

1,前端的html和javascript代码

页面html

<main style="text-align: center; margin: 200px auto;">
   <h2>输入用户名</h2>
   <form class="" action="demo01.php" method="post" style="margin-bottom: 20px;">
   <input id="user-name" type="text" name="username" placeholder="请填写您的用户名">
    <input type="submit" name="submit1" value="form提交1" class="input">
   </form>
   <input id="user-name2" type="text" name="username2" placeholder="请填写您的用户名">
   <input type="button" name="submit2" value="ajax提交2">
   <div class="box">
   </div>
  </main>
  <script src="../../js/jquery-3.1.0.min.js"></script>
  <script src="demo.js"></script>

页面中引入的demo01.js代码,注意此处实现的是一个简单的GET请求。

$(function($) {
  $('input[name=submit2]').on('click', function(e) {
   let username = '';
   if ('' !== (username = $('#user-name2').val())) {
    $.ajax({
     url: `demo.php?name=${username}`,
     dataType: 'json',
     method: 'GET',
     success: function(data) {
      if (data.result == 1) {
       $('.box').html(`<div>你的姓名${username}已成功保存。</div>`);
      }
     },
     error: function(xhr) {
      // 导致出错的原因较多,以后再研究
      alert('error:' + JSON.stringify(xhr));
     }
    })
    .done(function(data) {
     // 请求成功后要做的工作
     console.log('success');
    })
    .fail(function() {
     // 请求失败后要做的工作
     console.log('error');
    })
    .always(function() {
     // 不管成功或失败都要做的工作
     console.log('complete');
    });
   }
  });
 });

jQuery的ajax()方法有两种写法,分别是: $.ajax(url [, settings]); 和 $.ajax([settings]); 两种写法都可以,感觉第一种方法适合用于参数较少的情况,比如,如果只是对一个url做一个简单的请求,不对返回的数据、格式和错误有要求,只需要传递一个url参数就可以,那就可以用第一种写法。上面的demo01.js中采用的是第二种写法,下面解释下参数和相关的函数。

(1)上面代码中ajax()的参数

可以看到这里的参数类型都是javascript对象,即都是 o = {key: value}; 这种类型的数据。jQuery的文档中规定了,这里的参数只能是PlainObject(对象类型的对象),不能是null、自定义的数组、或者像docement这种归属于某种执行环境(比如浏览器)属于某种类型的对象。这里不太好说清楚,可以做个小试验。在命令行里打开node repl,进行下测试:

> node
 > typeof(null);
 'object'
 > typeof([]);
 'object'
 > typeof(document);
 'undefined'
 > typeof({});
 'object'

可以看到null、[](数组类型)、{}(对象类型)都是对象。因为在js中一切皆对象。而在交互式环境中,document则是未定义的一个变量,所以它的类型是undefined。如果在浏览器环境下测试下typeof(document),那么它的类型也是object。下面逐个解释下代码用到的参数:

url,要请求的url地址,它的值应该是包含url的字符串。

dataType,字符串。发出请求后,期望从服务器返回的数据类型。可以指定的类型有xml、html、script、json、jsonp、text。如果不指定,jquery会基于MIME做判断,并会返回一个下面xml、json、script、html当中的一种类型。

method,字符串。HTTP请求方法,默认为GET,上面代码中指定为POST。

success, Type: Function( Anything data, String textStatus, jqXHR jqXHR ) ,匿名函数。HTTP请求成功后要调用的函数,可以传递三个参数给它:从服务器返回的数据(如果上面指定了dataType,则服务器返回的数据类型需要与上面dataType指定的类型一致)、一个可以描述状态的字符串textStatus、还有一个jqXHR对象。可以看到上面只传递了从服务器返回的数据data。

error, Type: Function( jqXHR jqXHR, String textStatus, String errorThrown ) ,匿名函数。HTTP请求失败后要调用的函数,同样也可以传递三个参数。

除了用到的这些参数,还有许多其他的如:async、dataFilter、mimeType等其他参数,不过现在的这个简单的脚本还用不到那么多参数。

(2)“延迟加载函数”

上面代码中 $.ajax().done().fail().always() jqXHR.done()、jqXHR.fail()、jqXHR.always()中分别可以添加deferred对象被解析、被拒绝、被解析或被拒绝这三种情况下的要处理的工作,比如添加个函数什么的。为什么能够这么做呢,这要看$.ajax()返回了什么,它返回的是jqXHR对象(jquery版本大于1.5时)。这个对象实现了Promise interface(Promise机制,用来传递异步操作消息,代表了某个未来才会知道结果的事件)。这就允许在一次请求中添加多个回调函数,甚至可以在请求完成后添加回调函数。

标题“延迟加载”描述的不够准确,但从效果上看是有延迟加载的效果。关于这个问题更详细的解释可以参考jQuery文档中对jqXHR的解释  或一位前端前辈的解释jQuery的deferred对象详解 。

 2,后端运行在nginx服务器上的php代码

后端的逻辑很简单:我们把前端获取的数据保存到名为data-demo01的文件中,保存成功则向前端返回一个1作为标志。

(1)前端ajax发起GET请求

如果前端的ajax发起的是一个GET请求,那么后端也比较好处理:

if (isset($_GET['name']) && !empty($_GET['name'])) {
   $username = trim($_GET['name']);
   if (file_put_contents('data-demo01', $username)) {
    echo '{"result": 1}';
   } 
}

(2)前端ajax发起POST请求

js代码中需要修改下ajax()的url、method参数,并增加一个data参数,修改后如下:

// 相同的代码省略
 $.ajax({
  url: `demo01.php`,
  dataType: 'json',
  method: 'POST',
  data: {"username": username},
 // 相同的代码省略

因为用POST传递数据,所以去掉url中用来传递数据的参数,下面的data类型要与dataType一致,为json格式,然后将username作为值传递。

那么后端的代码也就可以确定了:

if (isset($_POST['username']) && !empty($_POST['username'])) {
   $username = trim($_POST['username']);
   if (file_put_contents('data-demo01', $username)) {
    echo '{"result": 1}';
   }
  }

如果不出错的话,效果应该是下面这样然后查看下data-demo01,名字果然被保存了。

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

那么问题来了,如果出错了呢?比如data-demo01文件不可写,或者后台服务器返回的数据格式有错误,或者网络出错。那又该怎么处理呢?我现在也不太清楚,后续再研究吧。

以上所述是小编给大家介绍的使用jQuery的ajax方法向服务器发出get和post请求的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 垃圾回收机制分析
Oct 10 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
JavaScript动态添加事件之事件委托
Jul 12 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
jQuery实现6位数字密码输入框
Dec 29 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
Nov 11 Javascript
详解javascript 正则表达式之分组与前瞻匹配
May 30 Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 Javascript
jquery的$().each和$.each的区别
Jan 18 jQuery
微信小程序页面间传值与页面取值操作实例分析
Apr 30 Javascript
微信小程序点击保存图片到本机功能
Dec 13 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
Aug 14 Javascript
jquery,js简单实现类似Angular.js双向绑定
Jan 13 #Javascript
jQuery实现的简单排序功能示例【冒泡排序】
Jan 13 #Javascript
js实现淡入淡出轮播切换功能
Jan 13 #Javascript
js仿百度音乐全选操作
Jan 13 #Javascript
js实现tab选项卡切换功能
Jan 13 #Javascript
js制作可以延时消失的菜单
Jan 13 #Javascript
原生js实现下拉框功能(支持键盘事件)
Jan 13 #Javascript
You might like
php 保留小数点
2009/04/21 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
python在不同层级目录import模块的方法
2016/01/31 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
Python中import机制详解
2017/11/14 Python
python reduce 函数使用详解
2017/12/05 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
python用requests实现http请求代码实例
2019/10/31 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
学校春季防火方案
2014/06/08 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android