0.前言
前些时间顺着Yeelink学习了RESTFUL,使用PHP和Slim框架尝试实现简单的REST API,树莓派可通过GET方法获得JSON数据包,通过这种方式实现了树莓派和服务器(我的PC)的互动。但是由于没有WEB前端,所以只能使用cURL工具或直接修改数据库的方式改变LED状态,体验非常差
REST API入门体验可参考:
【PHP再学习4—— slim框架学习和使用】
【PHP再学习5——RESTFul框架 远程控制LED】
受到【开源IOT——一个最小的物联网系统设计方案及源码】一文的影响。我决定除了服务器和嵌入式侧之外,我应该再多做一些。

0.1 代码仓库
如果您想查看本例的效果,请点击【京东云擎】
或者扫描二维码使用手机浏览器查看运行效果——
如果你想查看本例的代码,请点击【京东云擎代码仓库】
本人只是一个认真的初学者,如果有问题请邮件我。

0.1 REST API
使用PHP Slim框架构造REST API。其中有两个API和本例有关,一个为获得所有LED信息,LED信息包括ID,描述和状态;另一个为更新LED状态,LED状态只有两种ON或者OFF,代表打开和关闭。
【获得全部LED信息】
HTTP 方法 GET
HTTP URL /api/leds
HTTP 返回 如下图所示
【说明】1.total代表记录总数,使用total主要便于分页处理
2.rows代表具体记录,rows之后为json数组
3.若在URL中没有指定page和rows,默认page为1,rows为10.简单说默认仅返回10个。

图1 GET方法获得LED信息

【更新某个LED状态】
HTTP 方法 PUT
HTTP URL /api/leds/<leds_id>/status
HTTP 请求内容 {“status”:"on"}或{“status”:"off"}
HTTP 响应 {“success”:“true”}或{"success":"false"}


图2 PUT请求分析
2.更新表格
【1】创建一个表格,但不填充内容
    <div class="row">
      <div class="span12">
        <table class="table table-hover" id="ledsTable">
          <thead>
            <tr>
              <th>编号 ID</th>
              <th>描述 DESC</th>
              <th>状态 STATUS</th>
              <th>动作 ACTION</th>
            </tr>
          </thead>
        </table>
      </div>
    </div>
【2】更新表格——ajax方法
【JS代码】
    function updateall() {
    // 动态表格内容
    $.getJSON('http://localhost/api/leds',function(data){
     
      // data.total 表示记录总数
      // data.row 表示记录内容
      console.log(data.total);
   
      $.each( data.rows,function( index,item){
        // 取出 id description status
        var id = item.id; console.log(id);
        var description = item.description; console.log(description);
        var status = item.status; console.log(status); console.log(status);
     
        var btnStyle = 'btn-success';
        var btnText;
        // 修改按钮样式,ON为绿色 OFF为白色
        if( status == 'on'){
          btnStyle = 'btn-success';
          btnText = 'O N';
        } else {
          btnStyle = 'btn-default';
          btnText = 'OFF';
        }
       
        // 插入一行,很遗憾 javascript没有 format
        var newRow = '<tr dev_id="' + id + '">' +
              '<td>' + id + '</td>' +
              '<td>' + description + '</td>' +
              '<td>' + status + '</td>' +
              '<td>' +
                '<button type="button" class="btn btn-xs ' + btnStyle + '">' + btnText + '</button>' +
              '</td>' +
            '</tr>';
        $('#ledsTable').append(newRow);
       
      });
     
    });
    }
【几点说明】
1.$.getJSON('http://localhost/api/leds',function(data)
使用ajax的getJSON方法,URL为http://localhost/api/leds;若获得HTTP响应,响应内容在data中。
2.$.each( data.rows,item)
使用each方法遍历所有data.rows内容——所有LED信息,LED信息位于item中,而index为序号(和LED ID还不太相同)
3.var newRow = '<tr dev_id="' + id + '">' +
给所有的tr标签加上了 dev_id属性,便于LED改变状态时获得编号。
4.$('#ledsTable').append(newRow);
增加到表格中。

3.按钮控制
【基本流程】
按下表格末尾的button,在按钮事件处理中(确切地说为回调处理)找到tr标签中的设备ID,再从该行的第2个td标签中找到text,该text为当前的LED状态,最后组装一个PUT请求翻转LED状态。
【JS代码】
    $("table").delegate("button","click",function(){
   
      console.info($(this));
      // 尝试获得 <button>text</button>
      console.log($(this).text());
      var $tr_obj = $(this).parent().parent();
     
      // tr元素中包含 dev_id属性
      var dev_id = $tr_obj.attr('dev_id');
      console.log( dev_id );
     
      // 访问该tr元素的所有子td元素
      var $td_obj = $($tr_obj).children("td");
   
      // 所有td元素的第二个
      var $status_obj = $($td_obj).eq(2);
      var status_str = $status_obj.text();
      console.log(status_str);
     
      // 改变按钮样式
      if( status_str == "on"){
        $(this).removeClass('btn-success');$(this).addClass('btn-default');
        $(this).text("OFF");
        $status_obj.text("off");
        send_ledctrl( dev_id,"off");
      }else{
        $(this).removeClass('btn-default');$(this).addClass('btn-success');
        $(this).text("O N");
        $status_obj.text("on");
        send_ledctrl( dev_id,"on" );
      }
     
    });
    function send_ledctrl(dev_id,cur_status){
      $.ajax({
        url: '/api/leds/' + dev_id + '/status',// /api/leds/1
        async: true,dataType: 'json',type: 'PUT',data: JSON.stringify({status:cur_status}),success: function(data,textStatus){
          // 打印返回内容 {"success":true}
          console.log(data.success);
        },error: function(jqXHR,textStatus,errorThrown){
          console.log("error");
        },});
    }
【几点说明】
1.$("table").delegate("button",function(){
使用table的委托方法,子类为button,事件为click。delegate可以为动态创建的标签增加事件,有别于on方法。
2.var $tr_obj = $(this).parent().parent();
获得tr标签,采用子类找父类的方法。在这里$tr_obj为一个jquery对象,所有前面加$以标记。
3.$(this).removeClass('btn-success');$(this).addClass('btn-default');
根据LED的状态,清除BUTTON的旧样式,获得新样式。

4.最终效果

图3 最终效果

物联网学习笔记——构建RESTFul平台2的更多相关文章

  1. HTML5 input新增type属性color颜色拾取器的实例代码

    type 属性规定 input 元素的类型。本文较详细的给大家介绍了HTML5 input新增type属性color颜色拾取器的实例代码,感兴趣的朋友跟随脚本之家小编一起看看吧

  2. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  3. amazeui模态框弹出后立马消失并刷新页面

    这篇文章主要介绍了amazeui模态框弹出后立马消失并刷新页面,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. 移动HTML5前端框架—MUI的使用

    这篇文章主要介绍了移动HTML5前端框架—MUI的使用的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. canvas学习和滤镜实现代码

    这篇文章主要介绍了canvas学习和滤镜实现代码,利用 canvas,前端人员可以很轻松地、进行图像处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. localStorage的过期时间设置的方法详解

    这篇文章主要介绍了localStorage的过期时间设置的方法详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部