HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

【交流分享】Native.js获取设备当前网速

技术分享 源码 Native.JS

2.3开始android提供了一个流量统计类, android.net.TrafficStats,通过使用这个类提供的方法,就可以获取设备流量。
下面为该类中的常用方法,欢迎大家完善补充

static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数,不包含WiFi
static long getMobileRxPackets() //获取Mobile连接收到的数据包总数
static long getMobileTxBytes() //Mobile发送的总字节数
static long getMobileTxPackets() //Mobile发送的总数据包数
static long getTotalRxBytes() //获取总的接受字节数,包含Mobile和WiFi等
static long getTotalRxPackets() //总的接受数据包数,包含Mobile和WiFi等
static long getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等
static long getTotalTxPackets() //发送的总数据包数,包含Mobile和WiFi等
static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数,某一个进程的总接收量
static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数,某一个进程的总发送量

实现方法

        var TrafficStats;  //TrafficStats类实例对象  
        var total_data;    //总共接收到的流量  
        var traffic_data;  //一定时间内接收到的流量  
        var intervalId;    //定时器的返回值,用于控制计时器的停止  
        document.addEventListener('plusready', function(){  
            //console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。"  
            TrafficStats = plus.android.importClass("android.net.TrafficStats");  
            total_data = TrafficStats.getTotalRxBytes();  
            intervalId = window.setInterval("getNetSpeed()", 1000);   
        });  

        /**  
         * 核心方法  
         */  
        function getNetSpeed(){  
            traffic_data = TrafficStats.getTotalRxBytes() - total_data;  
            total_data = TrafficStats.getTotalRxBytes();  
            document.getElementById("net").value = bytesToSize(traffic_data);  
            console.log(bytesToSize(traffic_data));  
        }  

        //将byte自动转换为其他单位  
        function bytesToSize(bytes) {  
            if (bytes === 0) return '0 B/s';  
            var k = 1000, // or 1024  
                sizes = ['B/s', 'KB/s', 'MB/s', 'GB/s', 'TB/s', 'PB/s', 'EB/s', 'ZB/s', 'YB/s'],  
                i = Math.floor(Math.log(bytes) / Math.log(k));  
           return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];  
        }       

运行截图

附件下载

继续阅读 »

2.3开始android提供了一个流量统计类, android.net.TrafficStats,通过使用这个类提供的方法,就可以获取设备流量。
下面为该类中的常用方法,欢迎大家完善补充

static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数,不包含WiFi
static long getMobileRxPackets() //获取Mobile连接收到的数据包总数
static long getMobileTxBytes() //Mobile发送的总字节数
static long getMobileTxPackets() //Mobile发送的总数据包数
static long getTotalRxBytes() //获取总的接受字节数,包含Mobile和WiFi等
static long getTotalRxPackets() //总的接受数据包数,包含Mobile和WiFi等
static long getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等
static long getTotalTxPackets() //发送的总数据包数,包含Mobile和WiFi等
static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数,某一个进程的总接收量
static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数,某一个进程的总发送量

实现方法

        var TrafficStats;  //TrafficStats类实例对象  
        var total_data;    //总共接收到的流量  
        var traffic_data;  //一定时间内接收到的流量  
        var intervalId;    //定时器的返回值,用于控制计时器的停止  
        document.addEventListener('plusready', function(){  
            //console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。"  
            TrafficStats = plus.android.importClass("android.net.TrafficStats");  
            total_data = TrafficStats.getTotalRxBytes();  
            intervalId = window.setInterval("getNetSpeed()", 1000);   
        });  

        /**  
         * 核心方法  
         */  
        function getNetSpeed(){  
            traffic_data = TrafficStats.getTotalRxBytes() - total_data;  
            total_data = TrafficStats.getTotalRxBytes();  
            document.getElementById("net").value = bytesToSize(traffic_data);  
            console.log(bytesToSize(traffic_data));  
        }  

        //将byte自动转换为其他单位  
        function bytesToSize(bytes) {  
            if (bytes === 0) return '0 B/s';  
            var k = 1000, // or 1024  
                sizes = ['B/s', 'KB/s', 'MB/s', 'GB/s', 'TB/s', 'PB/s', 'EB/s', 'ZB/s', 'YB/s'],  
                i = Math.floor(Math.log(bytes) / Math.log(k));  
           return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];  
        }       

运行截图

附件下载

收起阅读 »

hbuilder/dcloud 用itools安卓模拟器调试app

HTML5+ 移动APP 默认话题

以前一直用hbuilder做web页面
后来发现hbuilder可以做webapp
官方给的文档是用谷歌的安卓模拟器 但是对国人来说 界面不太友好
后来自己试了 海马玩模拟器 又试了夜神模拟器 都是启动有点慢 界面不够清爽
然后发现了itools安卓模拟器 界面清爽干净 启动速度快

下面说下用hbuilder连接itools安卓模拟器的方法
itools模拟器的adb端口是54001

1.首先打开cmd

  1. 然后输出cd/ 回到根目录
  2. 然后

itools操作
cd Program Files (x86)\ThinkSky\iToolsAVM\tools (这是itools的adb目录)
.\adb connect 127.0.0.1:54001
.\adb devices

hbuilder 操作
cd HBuilder\tools (这是hbulider的adb目录)
.\adb connect 127.0.0.1:54001
.\adb devices

操作完成以后就可以用模拟器调试了

继续阅读 »

以前一直用hbuilder做web页面
后来发现hbuilder可以做webapp
官方给的文档是用谷歌的安卓模拟器 但是对国人来说 界面不太友好
后来自己试了 海马玩模拟器 又试了夜神模拟器 都是启动有点慢 界面不够清爽
然后发现了itools安卓模拟器 界面清爽干净 启动速度快

下面说下用hbuilder连接itools安卓模拟器的方法
itools模拟器的adb端口是54001

1.首先打开cmd

  1. 然后输出cd/ 回到根目录
  2. 然后

itools操作
cd Program Files (x86)\ThinkSky\iToolsAVM\tools (这是itools的adb目录)
.\adb connect 127.0.0.1:54001
.\adb devices

hbuilder 操作
cd HBuilder\tools (这是hbulider的adb目录)
.\adb connect 127.0.0.1:54001
.\adb devices

操作完成以后就可以用模拟器调试了

收起阅读 »

侧滑菜单官方说明文档缺少<div class="mui-off-canvas-backdrop"></div>

<!-- 侧滑导航根容器 -->
<div class="mui-off-canvas-wrap mui-draggable">
<!-- 菜单容器 -->
<aside class="mui-off-canvas-left">
<div class="mui-scroll-wrapper">
<div class="mui-scroll">
<!-- 菜单具体展示内容 -->
...
</div>
</div>
</aside>
<!-- 主页面容器 -->
<div class="mui-inner-wrap">
<!-- 主页面标题 -->
<header class="mui-bar mui-bar-nav">
<a class="mui-icon mui-action-menu mui-icon-bars mui-pull-left"></a>
<h1 class="mui-title">标题</h1>
</header>
<div class="mui-content mui-scroll-wrapper">
<div class="mui-scroll">
<!-- 主界面具体展示内容 -->
...
</div>
</div>


</div>
</div>

上面是官方说明文档的代码示例模板,在*****处 缺少 <div class="mui-off-canvas-backdrop"></div>

继续阅读 »

<!-- 侧滑导航根容器 -->
<div class="mui-off-canvas-wrap mui-draggable">
<!-- 菜单容器 -->
<aside class="mui-off-canvas-left">
<div class="mui-scroll-wrapper">
<div class="mui-scroll">
<!-- 菜单具体展示内容 -->
...
</div>
</div>
</aside>
<!-- 主页面容器 -->
<div class="mui-inner-wrap">
<!-- 主页面标题 -->
<header class="mui-bar mui-bar-nav">
<a class="mui-icon mui-action-menu mui-icon-bars mui-pull-left"></a>
<h1 class="mui-title">标题</h1>
</header>
<div class="mui-content mui-scroll-wrapper">
<div class="mui-scroll">
<!-- 主界面具体展示内容 -->
...
</div>
</div>


</div>
</div>

上面是官方说明文档的代码示例模板,在*****处 缺少 <div class="mui-off-canvas-backdrop"></div>

收起阅读 »

mui-table-view-cell 点击变色的问题。

<li class="mui-table-view-cell"></li>标签样式,在列表中经常用到。
有点不好就是,点击时,默认会有变色的点击效果。

这样写:
<li class="mui-table-view-cell mui-collapse-content"></li>

既保持原来样式效果,又去掉了点击变色。

继续阅读 »

<li class="mui-table-view-cell"></li>标签样式,在列表中经常用到。
有点不好就是,点击时,默认会有变色的点击效果。

这样写:
<li class="mui-table-view-cell mui-collapse-content"></li>

既保持原来样式效果,又去掉了点击变色。

收起阅读 »

论ask社区提问的正确姿势,谋求广大开发者达成共识

共识

为了提高服务质量和效率,在此呼吁大家能够能够遵守一些规则,提问前请花几分钟时间好好整理一下你的问题,为了方便大家帮助解决,不妨发一个可以最快重现问题的工程,这样也可以减少一下不必要的时间浪费。

1.提问前的准备
提问前最好先尝试自己解决,可以在论坛搜索以往的答案,实在没有找到合适的答案再提问不迟。不要重复提交问题,不然会被扣除多余的积分。请新手先查看积分规则:http://ask.dcloud.net.cn/score/index。提问可以参考一下下面这个总结:
提问的智慧

2.问题目标要明确
提问一定要让对方可以马上知道你想要的效果,而不是读了半天还不知道你想实现什么,你的困惑在哪里。所以标题一定很重要,一个准确的标题可以马上让对方知道你想问的是什么,也能够最快解决问题。

错误姿势:

正确姿势:

3.问题描述
建议提问的时候先说明自己的想要实现什么,自己采用的方案是什么,不要直接猜想,很多时候有些人猜测是什么问题,实际上有时候是一开始的思路或者其他地方错误,导致的问题,这样需要花很多时间去沟通排查,浪费时间。

像这种描述就比较清楚,这种也会有人愿意去解答。

继续阅读 »

为了提高服务质量和效率,在此呼吁大家能够能够遵守一些规则,提问前请花几分钟时间好好整理一下你的问题,为了方便大家帮助解决,不妨发一个可以最快重现问题的工程,这样也可以减少一下不必要的时间浪费。

1.提问前的准备
提问前最好先尝试自己解决,可以在论坛搜索以往的答案,实在没有找到合适的答案再提问不迟。不要重复提交问题,不然会被扣除多余的积分。请新手先查看积分规则:http://ask.dcloud.net.cn/score/index。提问可以参考一下下面这个总结:
提问的智慧

2.问题目标要明确
提问一定要让对方可以马上知道你想要的效果,而不是读了半天还不知道你想实现什么,你的困惑在哪里。所以标题一定很重要,一个准确的标题可以马上让对方知道你想问的是什么,也能够最快解决问题。

错误姿势:

正确姿势:

3.问题描述
建议提问的时候先说明自己的想要实现什么,自己采用的方案是什么,不要直接猜想,很多时候有些人猜测是什么问题,实际上有时候是一开始的思路或者其他地方错误,导致的问题,这样需要花很多时间去沟通排查,浪费时间。

像这种描述就比较清楚,这种也会有人愿意去解答。

收起阅读 »

东翌学院和Dcloud官方合作跨平台APP开发培训机构

HelloH5 mui HBuilder

东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:2971611409 欢迎有意向学习的朋友加好友咨询!上课地址

继续阅读 »

东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:2971611409 欢迎有意向学习的朋友加好友咨询!上课地址

收起阅读 »

【分享】uploader上传,java servlet 接收数据代码

上传 uploader
       ServletFileUpload servletFileUpload = new ServletFileUpload();  
        FileItemIterator fileItemIterator = servletFileUpload.getItemIterator(request);  

        byte[] imageDatas = null;  
        String imageName  = null;  
        String imgFormatName = null;  
        if (fileItemIterator.hasNext())  
        {  

            FileItemStream fileStream = fileItemIterator.next();  
            imageName = fileStream.getName();  

            if (imageName == null || imageName.trim().length() == 0)  
            {  
                throw new Exception("文件名称为空");  
            }  

            imageName = imageName.toLowerCase();  
            if (imageName.endsWith("jpg") || imageName.endsWith("jpeg"))  
            {  
                imgFormatName = "jpg";  
            }  
            else if (imageName.endsWith("png"))  
            {  
                imgFormatName = "png";  
            }  
            else if (imageName.endsWith("gif"))  
            {  
                imgFormatName = "gif";  
            }  
            else  
            {  
                throw new Exception("只支持:jpg、png、gif三种图片");  
            }  

            ByteArrayOutputStream baos = new ByteArrayOutputStream();  

            InputStream inputStream = null;  

            try {  
                inputStream = fileStream.openStream();  

                BufferedImage bufferedImage = ImageIO.read(inputStream);  

                int width = bufferedImage.getWidth();  
                int height = bufferedImage.getHeight();  

                BufferedImage needSavedImage = bufferedImage;  
                if (width > 600) {  
                    needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, 600, Float.valueOf(height * (600.0f/width)).intValue(), org.imgscalr.Scalr.OP_BRIGHTER);  
                }  
                else if (height > 600) {  
                    needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, Float.valueOf(width * (600.0f/height)).intValue(), 600, org.imgscalr.Scalr.OP_BRIGHTER);  
                }  

                ImageIO.write(needSavedImage, imgFormatName, baos);  

                imageDatas = baos.toByteArray();  
            }  
            catch(Exception e)  
            {  
                Logger.error(e.getMessage(), e);  
            }  
            finally   
            {  
                if (inputStream != null)  
                {  
                    try {  
                        inputStream.close();  
                    }  
                    catch(Exception e)  
                    {  
                        Logger.error(e.getMessage(), e);  
                    }  
                }  
            }  
        }  

这是一个简单的例子:
1) 图片格式只是通过扩展名来做了个简单地过滤
2) 图片的压缩,逻辑简单,够用了,更复杂的逻辑,自个儿补充就行
3)用到了两个库:apache的common upload 以及图片工具类库 org.imgscalr.Scalr (github上有源码,自个儿搜)

继续阅读 »
       ServletFileUpload servletFileUpload = new ServletFileUpload();  
        FileItemIterator fileItemIterator = servletFileUpload.getItemIterator(request);  

        byte[] imageDatas = null;  
        String imageName  = null;  
        String imgFormatName = null;  
        if (fileItemIterator.hasNext())  
        {  

            FileItemStream fileStream = fileItemIterator.next();  
            imageName = fileStream.getName();  

            if (imageName == null || imageName.trim().length() == 0)  
            {  
                throw new Exception("文件名称为空");  
            }  

            imageName = imageName.toLowerCase();  
            if (imageName.endsWith("jpg") || imageName.endsWith("jpeg"))  
            {  
                imgFormatName = "jpg";  
            }  
            else if (imageName.endsWith("png"))  
            {  
                imgFormatName = "png";  
            }  
            else if (imageName.endsWith("gif"))  
            {  
                imgFormatName = "gif";  
            }  
            else  
            {  
                throw new Exception("只支持:jpg、png、gif三种图片");  
            }  

            ByteArrayOutputStream baos = new ByteArrayOutputStream();  

            InputStream inputStream = null;  

            try {  
                inputStream = fileStream.openStream();  

                BufferedImage bufferedImage = ImageIO.read(inputStream);  

                int width = bufferedImage.getWidth();  
                int height = bufferedImage.getHeight();  

                BufferedImage needSavedImage = bufferedImage;  
                if (width > 600) {  
                    needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, 600, Float.valueOf(height * (600.0f/width)).intValue(), org.imgscalr.Scalr.OP_BRIGHTER);  
                }  
                else if (height > 600) {  
                    needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, Float.valueOf(width * (600.0f/height)).intValue(), 600, org.imgscalr.Scalr.OP_BRIGHTER);  
                }  

                ImageIO.write(needSavedImage, imgFormatName, baos);  

                imageDatas = baos.toByteArray();  
            }  
            catch(Exception e)  
            {  
                Logger.error(e.getMessage(), e);  
            }  
            finally   
            {  
                if (inputStream != null)  
                {  
                    try {  
                        inputStream.close();  
                    }  
                    catch(Exception e)  
                    {  
                        Logger.error(e.getMessage(), e);  
                    }  
                }  
            }  
        }  

这是一个简单的例子:
1) 图片格式只是通过扩展名来做了个简单地过滤
2) 图片的压缩,逻辑简单,够用了,更复杂的逻辑,自个儿补充就行
3)用到了两个库:apache的common upload 以及图片工具类库 org.imgscalr.Scalr (github上有源码,自个儿搜)

收起阅读 »

东翌学院和Dcloud官方合作跨平台APP开发培训机构

mui HBuilder

东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:2971611409 欢迎有意向学习的朋友加好友咨询!

继续阅读 »

东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:2971611409 欢迎有意向学习的朋友加好友咨询!

收起阅读 »

东翌学院和Dcloud官方合作跨平台APP开发培训机构

js HTML5
    东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!  
    东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;  
    东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!  
    咨询报名QQ:3391832203  欢迎有意向学习的朋友加好友咨询!
继续阅读 »
    东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!  
    东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;  
    东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!  
    咨询报名QQ:3391832203  欢迎有意向学习的朋友加好友咨询!
收起阅读 »

【文档】解决 MUI v3.2.0 headers 为 {'Content-Type': 'application/json'} 发起 POST 请求异常的问题

ajax headers application json mui post

Mui v3.2.0中ajax设置headers为{'Content-Type': 'application/json'}发起post请求,后端接收不到数据的解决方案(php为例)

问题场景

php部分

<?php  
    $name = $_POST['name'];  
    $password = $_POST['password'];  
    var_dump($name);  
    var_dump($password);  
?>  

mui.ajax()部分

mui.ajax({  
    url: 'http://192.168.12.74:80/test01.php',  
    type: 'post',  
        headers:{'Content-Type': 'application/json'},  
    data: {  
        name: 'dcloud',  
        password: '123456'  
    },  
    success: function(data) {  
        console.log(data);  
    },  
    error: function(xhr, type, errorThrown) {  
        console.log(type);  
    }  
});

控制台信息

Notice: Undefined index: name in test01.php on line 2
Notice: Undefined index: password in test01.php on line 3
我们按照通常的post方法去读取数据,发现并没有name和password这两个参数。

问题分析

可以参看下这篇文章《四种常见的 POST 提交数据方式》
当application/json这个Content-Type作为响应头时,我们需要手动处理一下:
从php://input 里获得原始输入流,再json_decode成对象。

方案一

php部分

<?php  
if ($_SERVER["CONTENT_TYPE"] == "application/json") {  
    $input = file_get_contents('php://input');  
    var_dump($input);  
    $object = json_decode($input);  
    $name = $object->name;  
    var_dump($name);  
}  
?>  

控制台信息一

'name=dcloud&password=123456' test01.php on line 4
null test01.php on line 7
此时,$input并不是一串json字符串,所以我们用json_decode去转换依旧是失败的,并不能拿到我们想要的数据。

mui.ajax()部分

mui.ajax()默认会对data里面的数据进行序列化,最终导致php接受到的是序列化以后的字符串。我们需要禁用对data的序列化(processData:false),并把参数对象序列化成json字符串(JSON.stringify())传给data。

mui.ajax({  
    url: 'http://192.168.12.74:80/test01.php',  
    type: 'post',  
    headers: {  
        'Content-Type': 'application/json'  
    },  
    processData: false,  
    data: JSON.stringify({  
        name: 'dcloud',  
        password: '123456'  
    }),  
    success: function(data) {  
        console.log(data);  
    },  
    error: function(xhr, type, errorThrown) {  
        console.log(type);  
    }  
});  

控制台信息二

'dcloud' test01.php on line 7
name参数的值被正确解析,问题解决。

方案二

只需修改php部分即可,方案一中我们在未设置processData属性为false时,获取的是一串序列化后的字符串'name=dcloud&password=123456'。我们对字符串进行截取,同样可以解析出我们想要的参数数据。

php部分

<?php  
    if($_SERVER["CONTENT_TYPE"]=="application/json"){  
        $input = file_get_contents('php://input');  
        $arr = explode("&", $input);  
    $narr = explode("=", $arr[0]);  
    $parr = explode("=", $arr[1]);  
    $name = $narr[1];  
    $password = $parr[1];  
        var_dump($name);  
        var_dump($password);  
    }  
?>  

mui.ajax()部分:

mui.ajax({  
    url: 'http://192.168.12.74:80/test02.php',  
    type: 'post',  
    headers: {  
        'Content-Type': 'application/json'  
    },  
    data: {  
        name: 'dcloud',  
        password: '123456'  
    },  
    success: function(data) {  
        console.log(data);  
    },  
    error: function(xhr, type, errorThrown) {  
        console.log(type);  
    }  
});  

控制台信息

'dcloud' test02.php on line 9
'123456' test02.php on line 10
通过对字符串的截取分组,最终取得我们想要的参数数据,但是此方法的缺点在于参数的顺序不明或数量太多会非常繁琐。

后续解决

Mui v3.3.0,将对此情况进行更加精确的处理,3.2.0版本遇到此问题可按照上面的方式进行处理数据。

继续阅读 »

Mui v3.2.0中ajax设置headers为{'Content-Type': 'application/json'}发起post请求,后端接收不到数据的解决方案(php为例)

问题场景

php部分

<?php  
    $name = $_POST['name'];  
    $password = $_POST['password'];  
    var_dump($name);  
    var_dump($password);  
?>  

mui.ajax()部分

mui.ajax({  
    url: 'http://192.168.12.74:80/test01.php',  
    type: 'post',  
        headers:{'Content-Type': 'application/json'},  
    data: {  
        name: 'dcloud',  
        password: '123456'  
    },  
    success: function(data) {  
        console.log(data);  
    },  
    error: function(xhr, type, errorThrown) {  
        console.log(type);  
    }  
});

控制台信息

Notice: Undefined index: name in test01.php on line 2
Notice: Undefined index: password in test01.php on line 3
我们按照通常的post方法去读取数据,发现并没有name和password这两个参数。

问题分析

可以参看下这篇文章《四种常见的 POST 提交数据方式》
当application/json这个Content-Type作为响应头时,我们需要手动处理一下:
从php://input 里获得原始输入流,再json_decode成对象。

方案一

php部分

<?php  
if ($_SERVER["CONTENT_TYPE"] == "application/json") {  
    $input = file_get_contents('php://input');  
    var_dump($input);  
    $object = json_decode($input);  
    $name = $object->name;  
    var_dump($name);  
}  
?>  

控制台信息一

'name=dcloud&password=123456' test01.php on line 4
null test01.php on line 7
此时,$input并不是一串json字符串,所以我们用json_decode去转换依旧是失败的,并不能拿到我们想要的数据。

mui.ajax()部分

mui.ajax()默认会对data里面的数据进行序列化,最终导致php接受到的是序列化以后的字符串。我们需要禁用对data的序列化(processData:false),并把参数对象序列化成json字符串(JSON.stringify())传给data。

mui.ajax({  
    url: 'http://192.168.12.74:80/test01.php',  
    type: 'post',  
    headers: {  
        'Content-Type': 'application/json'  
    },  
    processData: false,  
    data: JSON.stringify({  
        name: 'dcloud',  
        password: '123456'  
    }),  
    success: function(data) {  
        console.log(data);  
    },  
    error: function(xhr, type, errorThrown) {  
        console.log(type);  
    }  
});  

控制台信息二

'dcloud' test01.php on line 7
name参数的值被正确解析,问题解决。

方案二

只需修改php部分即可,方案一中我们在未设置processData属性为false时,获取的是一串序列化后的字符串'name=dcloud&password=123456'。我们对字符串进行截取,同样可以解析出我们想要的参数数据。

php部分

<?php  
    if($_SERVER["CONTENT_TYPE"]=="application/json"){  
        $input = file_get_contents('php://input');  
        $arr = explode("&", $input);  
    $narr = explode("=", $arr[0]);  
    $parr = explode("=", $arr[1]);  
    $name = $narr[1];  
    $password = $parr[1];  
        var_dump($name);  
        var_dump($password);  
    }  
?>  

mui.ajax()部分:

mui.ajax({  
    url: 'http://192.168.12.74:80/test02.php',  
    type: 'post',  
    headers: {  
        'Content-Type': 'application/json'  
    },  
    data: {  
        name: 'dcloud',  
        password: '123456'  
    },  
    success: function(data) {  
        console.log(data);  
    },  
    error: function(xhr, type, errorThrown) {  
        console.log(type);  
    }  
});  

控制台信息

'dcloud' test02.php on line 9
'123456' test02.php on line 10
通过对字符串的截取分组,最终取得我们想要的参数数据,但是此方法的缺点在于参数的顺序不明或数量太多会非常繁琐。

后续解决

Mui v3.3.0,将对此情况进行更加精确的处理,3.2.0版本遇到此问题可按照上面的方式进行处理数据。

收起阅读 »

我是设计,需要设计的找我,价格公道

外包

专业设计,价格公道,态度友好,两年设计经验,需要设计的找我。
扣扣:80883080

专业设计,价格公道,态度友好,两年设计经验,需要设计的找我。
扣扣:80883080