bootstrap与REST应用

0.前言

前些时间顺着Yeelink学习了RESTFUL,使用PHP和Slim框架尝试实现简单的REST API,树莓派可通过GET方法获得JSON数据包,通过这种方式实现了树莓派和服务器(我的PC)的互动。但是由于没有WEB前端,所以只能使用cURL工具或直接修改数据库的方式改变LED状态,体验非常差

REST API入门体验可参考

PHP再学习4—— slim框架学习和使用

PHP再学习5——RESTFul框架 远程控制LED

受到【开源IOT——一个最小的物联网系统设计方案及源码】一文的影响。我决定除了服务器和嵌入式侧之外,我应该再多做一些。

WEB前端涉及到非常多的知识,下面提供一些学习资料。下面各种技术您可能不知道但是您一定用过。

【HTML】——超文本标记语言

【CSS】——级联样式表,能够对网页中的对象的位置排版进行像素级的精确控制

【Javascript】——网络的脚本语言

【Jquery】——JavaScript 库,极大地简化了 JavaScript 编程

【Ajax】——异步的 JavaScript 和 XML,与服务器交换数据并更新部分网页的艺术
     本例部分源代码——【HTML代码

1.前端框架——Bootstrap

由于前端的内容太多了,需要学习很长的时间(技术可学习,但是审美我真学不来)。还好各路高手开发了前端框架可以让我们方便而美观的实现网页开发,而把精力放在真正的idea上。推荐使用Bootstrap框架,Bootstrap是Twitter推出的一个用于前端开发的开源工具包,是一个CSS/HTML框架。

学习资料

Bootstrap中文网

Bootstrap 教程

2.简单例子

下面一个简单的例子来自于Bootstrap中文网,仅修改了title和h1元素中等内容。

[html] view plaincopy

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>LED Remote Control Template</title>
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <!-- Bootstrap -->
  7. <link rel="stylesheet" href="http://cdn.bootcss.com/twitter-bootstrap/3.0.3/css/bootstrap.min.css">
  8. </head>
  9. <body>
  10. <h1>LED Remote Control using REST API!</h1>
  11. <!-- jQuery (necessary for Bootstrap‘s JavaScript plugins) -->
  12. <script src="http://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
  13. <!-- Include all compiled plugins (below), or include individual files as needed -->
  14. <script src="http://cdn.bootcss.com/twitter-bootstrap/3.0.3/js/bootstrap.min.js"></script>
  15. </body>
  16. </html>

图1 简单例子

【若干说明】

【CDN】在这里并没有把Bootstrap框架放置于本地服务器,而是使用了CDN服务。CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。

【JQuery】Bootstrap需要JQuery的支持

【CSS和JS】先载入Bootscript的CSS样式,然后载入Bootscript的JS包。

3.加个表格

【设计思路】

上面的例子未免有些单薄,可再加入一些表格和DIV块。基本思路——网页分为3个部分,一个部分为Header,包含一些作者信息;第二部分为主要内容——表格,表格中包含LED设备的编号、描述和当前状态(打开或关闭)等,该部分内容和数据库中的表结构对应。最后一部分为footer,可包含一些其他的信息例如我的邮箱等。

【HTML】

[html] view plaincopy

  1. <body>
  2. <div class="container">
  3. <div class="row">
  4. <div class="span12">
  5. <p class="lead">徐凯经验分享小站</p>
  6. </div>
  7. </div>
  8. <div class="row">
  9. <div class="span12">
  10. <table class="table table-hover">
  11. <thead>
  12. <tr>
  13. <th>编号 ID</th>
  14. <th>描述 DESC</th>
  15. <th>状态 STATUS</th>
  16. <th>动作 ACTION</th>
  17. </tr>
  18. </thead>
  19. <tbody>
  20. <tr>
  21. <td>1</td>
  22. <td>RPi.PCF8574.IO0</td>
  23. <td>ON</td>
  24. <td>ACTION</td>
  25. </tr>
  26. <tr>
  27. <td>2</td>
  28. <td>RPi.PCF8574.IO1</td>
  29. <td>OFF</td>
  30. <td>ACTION</td>
  31. </tr>
  32. </tbody>
  33. </table>
  34. </div>
  35. </div>
  36. <div class="row">
  37. <div class="span12">
  38. <p class="text-right lead">如果有问题请邮件我,别客气</p>
  39. <p class="text-right lead">
  40. <em>Email:[email protected]</em>
  41. </p>
  42. </div>
  43. </div>
  44. </div>

图2 加入表格后的效果

【几点说明】

【container】 <div class="container"> container可理解为一个容器,该容器包裹了页面上的所有内容。

【网格布局】 bootstrap采用网格布局,<div class="row"> <div class="span12">row代表一行,span代表一行中的内容。在一行中最多可分为12个单元,最小单元用span1标记,最大单元用span12标记。举个例子<div class="span6">占用该行的6个单元,占用该行的一半。

【table】在bootstrap中可选择表格的风格, <table class="table table-hover">本例选择了hover形式,当鼠标移动到某一行时,该行的背景会变得灰色一些。这种简单的动态效果给用户更好的体验。

【thead tbody tr  td】thead为表头标签,tbody为表格内容标签,tr为表格行标签,td为表格中的具体单元标签。

4.按钮热身

【设计思路】

在表格每行最后一个td标签中加入一个Button,点击该Button可以翻转stauts。例如点击Button,同行的Status会从ON变为OFF,再次点击从ON变为OFF。为了实现这种对应关系的操作,在tr标签中加入一个设备编号取名为dev_id。

【HTML】

[html] view plaincopy

  1. <table class="table table-hover">
  2. <thead>
  3. <tr>
  4. <th>编号 ID</th>
  5. <th>描述 DESC</th>
  6. <th>状态 STATUS</th>
  7. <th>动作 ACTION</th>
  8. </tr>
  9. </thead>
  10. <tbody>
  11. <tr dev_id="1">
  12. <td>1</td>
  13. <td>RPi.PCF8574.IO0</td>
  14. <td >off</td>
  15. <td>
  16. <button type="button" class="btn btn-primary btn-xs">Toggle</button>
  17. </td>
  18. </tr>
  19. <tr dev_id="2">
  20. <td>2</td>
  21. <td>RPi.PCF8574.IO1</td>
  22. <td>off</td>
  23. <td>
  24. <button type="button" class="btn btn-primary btn-xs">Toggle</button>
  25. </td>
  26. </tr>
  27. </tbody>
  28. </table>

图3 加入按钮后的效果

【几点说明】

【tr编号】 <tr dev_id="1"> 给每一行加入一个编号,1、2、3以此类推逐个排列。

【Button】<button type="button" class="btn btn-primary btn-xs"> bootstrap提供了多种标签风格,在这里选择最小号的Button——btn-xs 。

5.按钮互动

【设计思路】

要实现按钮互动就需要写点javascript代码,幸好Javascript不算复杂非常容易学习。编程之前需要理解一下HTML节点的概念。在HTML中所有的元素都是节点,如此之多的节点组成了“树”,节点有父节点、有子节点也会有邻居节点。例如本例中,tr标签有4个td子节点(td子节点的编号从0开始),在最后一个td节点中又有一个button节点。

【tr dev_id="1"】——> 【td(id)】【td(desc)】【td(status)】【td(action)】

【td(action)】——> 【button】

那么如果点击button想要获得表格中该行dev_id的信息,那么就需要找button的“爷爷”索要。

【javascript】

[javascript] view plaincopy

  1. <script>
  2. $(document).ready(function(){
  3. $(‘.btn‘).on("click",function(){
  4. // 获得 tr元素
  5. var trobj = $(this).parent().parent();
  6. // tr元素中包含 dev_id属性
  7. var dev_id = trobj.attr(‘dev_id‘);
  8. console.log( dev_id );
  9. // 访问该tr元素的所有子td元素
  10. var tdobj = $(trobj).children("td");
  11. var status_obj = $(tdobj).eq(2);
  12. var status_str = status_obj.text();
  13. console.log(status_str);
  14. if( status_str == "on"){
  15. status_obj.text("off");
  16. sendLedControl( dev_id , "off" );
  17. }else{
  18. status_obj.text("on");
  19. sendLedControl( dev_id , "on" );
  20. }
  21. });
  22. });
  23. </script>

【控制台查看效果】

web浏览器中的控制台有点和串口调试相似,在chrome浏览器中 工具->开发者工具。

图4 控制台调试

【若干说明】

【$(document).ready()】当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件。

【$(‘.btn‘).on("click",function())】按钮点击事件响应,$(‘.btn‘)代表所有所有class为btn的按钮——表格中最后一列按钮。

【this】在按钮点击事件中,this为button标签。如果使用console.log打印的话,输出内容为<button type="button" class="btn btn-primary btn-xs">Toggle</button>。但是$(this)则代表一个文件对象模型,$(this) 
 是一个完整的对象包含很多属性和方法。

【选择tr】var trobj = $(this).parent().parent(); 试图寻找button的爷爷

【获得dev_id】var dev_id = trobj.attr(‘dev_id‘); dev_id在td标签中,使用attr方法便可获得目标属性。

【获得所有的td标签】var tdobj = $(trobj).children("td"); 此时td标签共有4个——返回4个td对象

【定位第2个td标签】var status_obj = $(tdobj).eq(2);  eq(2)代表选择第2个(从0开始)td标签——对应status标签,var status_str = status_obj.text(); 取出当前内容并通过console.log打印。

【翻转操作,修改text】status_obj.text("off"); 使用text方法重新修改td标签的属性。

【发送PUT请求】  sendLedControl 请查看下节内容。

6.PUT更新

【设计思路】

使用ajax发送一个PUT请求,更多信息请参考【PHP再学习5——RESTFul框架 远程控制LED】,PUT请求的格式如下:

    PUT /api/leds/1

    Host: localhost

    Content-Length: 15

 

    {"status":"on"}    

【代码实现】

[javascript] view plaincopy

  1. function sendLedControl( dev_id , cur_status ){
  2. $.ajax({
  3. url: ‘/api/leds/‘ + dev_id, // /api/leds/1
  4. async: true,
  5. dataType: ‘json‘,
  6. type: ‘PUT‘,
  7. data: JSON.stringify({status:cur_status}),
  8. success: function(data , textStatus){
  9. console.log("success");
  10. },
  11. error: function(jqXHR , textStatus , errorThrown){
  12. console.log("error");
  13. },
  14. });
  15. }

【执行结果】

chrome浏览器 工具->开发者工具 选择Network Tag

图5 发送PUT请求

图6 查看status新状态

【若干说明】

【url】 /api/leds/1(和【PHP再学习5——RESTFul框架 远程控制LED】略有差异),LED设备的"网址"。

【dataType】请求内容为JSON格式

【type】请求方法为PUT——更新某LED设备信息

【data】请注意使用JSON.stringify方法,转换之后的格式为{"status":"on"},若没有stringify方法转换的结果为status:on,这并不符合PUT上传内容的规范。

【 success 和 error】正确处理和错误处理方法。

【遗留问题】虽然PUT请求和响应完全正确,但是Jquery总是调用error。网上查找了众多博客和帖子依然没有解决。再思考是不是PUT请求没有响应导致的,修改服务器侧代码问题,使得PUT响应中包含更新之后的LED状态问题,问题随之解决。

7.总结和源码

因为对前端相关技术不熟悉,所以我以很认真的态度写完了这篇博文。如果您觉得内容中说的不清楚或者错误的地方请留言或者Email我。认真学完这篇博文,发现前端技术javascript,ajax和jquery没有想象的那么可怕甚至还挺好用的。这几天关注了espruino——使用javascript开发MCU的平台,总觉得工程师应该多学一些,见多识广才才行。
HTML代码

原文地址

bootstrap与REST应用

时间: 2024-09-29 22:08:41

bootstrap与REST应用的相关文章

Bootstrap + AngularJS+ Ashx + SQL Server/MySQL

去年年底12月,为适应移动端浏览需求,花了1个月时间学习Bootstrap,并将公司ASP网站重构成ASP.NET. 当时采取的网站架构: Bootstrap + jQuery + Ashx + SQL Server 时间紧,没人带,只能硬着头皮,最后如期完成,但是也遗留了几个问题. 问题: 1.页面查询条件太复杂,太多的checkbox,jQuery操作DOM虽然方便,但是组合成json提交给后端还是比较麻烦,有没有天然支持json的前端框架或者脚本语言? html控件做的任何修改,都自动保存

CSS,bootstrap表格控制当td内容过长时用省略号表示,以及在不使用bootstrap时过长也用省略号表示

首先需要在table中设置table-layout:fixed; <table style="table-layout:fixed"></table> 然后在表头th中设置每列的宽度 <table style="table-layout:fixed"> <th width="10%">Title01</th> <th width="20%">Title02

Bootstrap &amp; Font Awesome 学习笔记

学习网站:http://bootstrap.ninghao.net/index.html https://www.freecodecamp.cn http://www.runoob.com/bootstrap/bootstrap-tutorial.html Bootstrap 为快速简单的实施 Web 开发准备的前端架构. Bootstrap将会根据你的屏幕的大小来调整HTML元素的大小 -- 强调 响应式设计的概念. 通过响应式设计,你无需再为你的网站设计一个手机版的.它在任何尺寸的屏幕上看起

第二百三十八节,Bootstrap输入框和导航组件

Bootstrap输入框和导航组件 学习要点: 1.输入框组件 2.导航组件 3.导航条组件 本节课我们主要学习一下Bootstrap的两个个组件功能:输入框组件和导航导航条组件. 一.输入框组件 文本输入框就是可以在<input>元素前后加上文字或按钮,可以实现对表单控件的扩展. 在左侧添加文字 input-group-addon样式class类,写在input同级的span里,给输入框添加一个左片段(Bootstrap)input-group样式class类,写在input外层div里,将

第二百三十一节,Bootstrap 介绍

Bootstrap 介绍 学习要点: 1.Bootstrap 概述 2.Bootstrap 特点 3.Bootstrap 结构 4.创建第一个页面 5.学习的各项准备 本节课我们主要了解一下 Boostrap 历史.特点.用途,以及为什么选择 Boostrap 来开 发我们的 Web 项目. 一.Bootstrap 概述 Bootstrap 是由 Twitter 公司(全球最大的微博)的两名技术工程师研发的一个基于 HTML.CSS.JavaScript 的开源框架.该框架代码简洁.视觉优美,可

Flask---使用Bootstrap新建第一个demo

Flask---使用Bootstrap新建第一个demo 参考自http://www.jianshu.com/p/417bcbad82fb 还有<Flask web开发> 前端用到Bootstrap开源框架,Bootstrap是客户端框架,后台当然就是Flask了. 服务器需要做的只是提供引用了Bootstrap层叠样式表(CSS)和JS文件的html响应,并且在html.css和js代码中实例化需要的组件,这些操作的最理想的执行环境就是模板 关于模板的介绍及其实现原理:https://kb.

bootstrap中的对话框-dialog

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> <meta http-

bootstrap中的对话框-dialog-2

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> <meta http-

关于H5框架之Bootstrap的小知识

浏览器支持 旧的浏览器可能无法很好的支持 Bootstrap 支持 Internet Explorer 8 及更高版本的 IE 浏览器 CSS源码研究 我们不是在head里面引入了下面这些文件么 <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"> &l

Bootstrap 之 Carousel

Bootstrap 轮播(Carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除此之外,内容也是足够灵活的,可以是图像.内嵌框架.视频或者其他您想要放置的任何类型的内容. 如果您想要单独引用该插件的功能,那么您需要引用 carousel.js.或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js. 下面是一个简单的幻灯片,使用 Bootstrap 轮播(Carousel)插件显示了一个循环播放元素的