http接口测试工具-Advanced-REST-client(Chrome插件)

非常好用的http接口测试工具

相信作为一个开发人员,大家或多或少的要写或者接触一些http接口。而当我们需要本地调试接口常常会因为没有一款好用的工具而烦恼。

今天要给大家介绍一款非常好用、实用且方便的http接口测试工具。

本人认为这是目前我用过的最好http接口测试工具(没有之一),先给大家展示一下。

阅读详细 »

一个websocket的聊天室程序(php server)

通过命令行执行php文件  
如:D:\wamp\bin\php\php5.5.12\php -q D:\wamp\www\127.0.0.2\websocket\server.php 

通过本地web服务器访问 http://127.0.0.1/websocket/index.html即可

notice: 
需要php5.3或以上的执行环境,和一个web服务器如apache
浏览器需支持html5 web socket
这里监听 socket端口 9505,如遇到端口被占用可能需要在这两个文件内修改端口或者杀死相应端口进程

index.html代码:

<!DOCTYPE html>
<html>
    <head>
        <title>chatdemo</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, user-scalable=no">
        <link href="https://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
        <style type="text/css">
        <!--
        html, body {
          min-height: 100%; }

        body {
          margin: 0;
          padding: 0;
          width: 100%;
          font-family: "Microsoft Yahei",sans-serif, Arial; }

        .container {
          text-align: center; }

        .title {
          font-size: 16px;
          color: rgba(0, 0, 0, 0.3);
          position: fixed;
          line-height: 30px;
          height: 30px;
          left: 0px;
          right: 0px;
          background-color: white; }

        .content {
          background-color: #f1f1f1;
          border-top-left-radius: 6px;
          border-top-right-radius: 6px;
          margin-top: 30px; }
          .content .show-area {
            text-align: left;
            padding-top: 8px;
            padding-bottom: 168px; }
            .content .show-area .message {
              width: 70%;
              padding: 5px;
              word-wrap: break-word;
              word-break: normal; }
          .content .write-area {
            position: fixed;
            bottom: 0px;
            right: 0px;
            left: 0px;
            background-color: #f1f1f1;
            z-index: 10;
            width: 100%;
            height: 160px;
            border-top: 1px solid #d8d8d8; }
            .content .write-area .send {
              position: relative;
              top: -28px;
              height: 28px;
              border-top-left-radius: 55px;
              border-top-right-radius: 55px; }
            .content .write-area #name{
              position: relative;
              top: -20px;
              line-height: 28px;
              font-size: 13px; }
        -->
        </style>
    </head>
    <body>
        <div class="container">
            <div class="title">简易聊天demo</div>
            <div class="content">
                <div class="show-area"></div>
                <div class="write-area">
                    <div><button class="btn btn-default send" >发送</button></div>
                    <div><input name="name" id="name" type="text" placeholder="input your name"></div>
                    <div>
                        <textarea name="message" id="message" cols="38" rows="4" placeholder="input your message..."></textarea>
                    </div>                    
                </div>
            </div>
        </div>

        <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
        <script src="https://cdn.bootcss.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
        <script>
        $(function(){
            var wsurl = 'ws://127.0.0.1:9505/websocket/server.php';
            var websocket;
            var i = 0;
            if(window.WebSocket){
                websocket = new WebSocket(wsurl);

                //连接建立
                websocket.onopen = function(evevt){
                    console.log("Connected to WebSocket server.");
                    $('.show-area').append('<p class="bg-info message"><i class="glyphicon glyphicon-info-sign"></i>Connected to WebSocket server!</p>');
                }
                //收到消息
                websocket.onmessage = function(event) {
                    var msg = JSON.parse(event.data); //解析收到的json消息数据

                    var type = msg.type; // 消息类型
                    var umsg = msg.message; //消息文本
                    var uname = msg.name; //发送人
                    i++;
                    if(type == 'usermsg'){
                        $('.show-area').append('<p class="bg-success message"><i class="glyphicon glyphicon-user"></i><a name="'+i+'"></a><span class="label label-primary">'+uname+' say: </span>'+umsg+'</p>');
                    }
                    if(type == 'system'){
                        $('.show-area').append('<p class="bg-warning message"><a name="'+i+'"></a><i class="glyphicon glyphicon-info-sign"></i>'+umsg+'</p>');
                    }
                    
                    $('#message').val(''); 
                    window.location.hash = '#'+i;
                }

                //发生错误
                websocket.onerror = function(event){
                    i++;
                    console.log("Connected to WebSocket server error");
                    $('.show-area').append('<p class="bg-danger message"><a name="'+i+'"></a><i class="glyphicon glyphicon-info-sign"></i>Connect to WebSocket server error.</p>');
                    window.location.hash = '#'+i;
                }

                //连接关闭
                websocket.onclose = function(event){
                    i++;
                    console.log('websocket Connection Closed. ');
                    $('.show-area').append('<p class="bg-warning message"><a name="'+i+'"></a><i class="glyphicon glyphicon-info-sign"></i>websocket Connection Closed.</p>');
                    window.location.hash = '#'+i;
                }

                function send(){
                    var name = $('#name').val();
                    var message = $('#message').val();
                    if(!name){
                        alert('请输入用户名!');
                        return false;
                    }
                    if(!message){
                        alert('发送消息不能为空!');
                        return false;
                    }
                    var msg = {
                        message: message,
                        name: name
                    };
                    try{  
                        websocket.send(JSON.stringify(msg)); 
                    } catch(ex) {  
                        console.log(ex);
                    }  
                }

                //按下enter键发送消息
                $(window).keydown(function(event){
                    if(event.keyCode == 13){
                        console.log('user enter');
                        send();
                    }
                });

                //点发送按钮发送消息
                $('.send').bind('click',function(){
                    send();
                });
                
            }
            else{
                alert('该浏览器不支持web socket');
            }

        });    
        </script>        
    </body>
</html>

server.php代码

<?php
$host = '127.0.0.1'; 
$port = '9505'; 
$null = NULL; 

//创建tcp socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, 0, $port);

//监听端口
socket_listen($socket);

//连接的client socket 列表
$clients = array($socket);

//设置一个死循环,用来监听连接 ,状态
while (true) {
    
    $changed = $clients;
    socket_select($changed, $null, $null, 0, 10);
    
    //如果有新的连接
    if (in_array($socket, $changed)) {
        //接受并加入新的socket连接
        $socket_new = socket_accept($socket); 
        $clients[] = $socket_new;
        
        //通过socket获取数据执行handshake
        $header = socket_read($socket_new, 1024); 
        perform_handshaking($header, $socket_new, $host, $port);
        
        //获取client ip 编码json数据,并发送通知
        socket_getpeername($socket_new, $ip);
        $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected')));
        send_message($response);
        $found_socket = array_search($socket, $changed);
        unset($changed[$found_socket]);
    }
    
    //轮询 每个client socket 连接
    foreach ($changed as $changed_socket) {    
        
        //如果有client数据发送过来
        while(socket_recv($changed_socket, $buf, 1024, 0) >= 1)
        {
            //解码发送过来的数据
            $received_text = unmask($buf); 
            $tst_msg = json_decode($received_text);  
            $user_name = $tst_msg->name; 
            $user_message = $tst_msg->message; 
            
            //把消息发送回所有连接的 client 上去
            $response_text = mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message)));
            send_message($response_text);
            break 2; 
        }
        
        //检查offline的client
        $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
        if ($buf === false) { 
            $found_socket = array_search($changed_socket, $clients);
            socket_getpeername($changed_socket, $ip);
            unset($clients[$found_socket]);
            $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected')));
            send_message($response);
        }
    }
}
// 关闭监听的socket
socket_close($sock);

//发送消息的方法
function send_message($msg)
{
    global $clients;
    foreach($clients as $changed_socket)
    {
        @socket_write($changed_socket,$msg,strlen($msg));
    }
    return true;
}


//解码数据
function unmask($text) {
    $length = ord($text[1]) & 127;
    if($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    }
    elseif($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    }
    else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i%4];
    }
    return $text;
}

//编码数据
function mask($text)
{
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);
    
    if($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header.$text;
}

//握手的逻辑
function perform_handshaking($receved_header,$client_conn, $host, $port)
{
    $headers = array();
    $lines = preg_split("/\r\n/", $receved_header);
    foreach($lines as $line)
    {
        $line = chop($line);
        if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
        {
            $headers[$matches[1]] = $matches[2];
        }
    }

    $secKey = $headers['Sec-WebSocket-Key'];
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
    "Upgrade: websocket\r\n" .
    "Connection: Upgrade\r\n" .
    "WebSocket-Origin: $host\r\n" .
    "WebSocket-Location: ws://$host:$port/demo/shout.php\r\n".
    "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_conn,$upgrade,strlen($upgrade));
}

几种知名开源富文本编辑器记录和对比(仅供参考)

1、UEditor 百度的。

优点:插件多,基本满足各种需求,类似贴吧中的回复界面。

缺点:不再维护,文档极少,使用并不普遍,图片只能上传到本地服务器,如果需要上传到其他服务器需要改动源码,较为难办,加载速度慢。

总结:小项目,可以用用,不推荐使用。

 

2、kindeditor

界面类似百度,效果很像

文档齐全但用例较少,使用还算方便。

缺点:总感觉样子不是很好看,没有现代那种风格,还是老式的传统图标。

http://kindeditor.net/demo.php

 

3、simditor

样式好看,插件不多,基本满足需求

文档英文,使用较为吃力,如果英文水平不好的话

github上面开源,维护较好

因为文档看起来吃力,所以本人没有考虑继续使用。

http://simditor.tower.im/

 

4、bootstrap-wysiwyg

利用bootstrap实现的,简洁大方好看。

优点:轻量,好看,使用方便。

缺点:需要一定的浏览器支持,毕竟需要bootstrap

http://www.bootcss.com/p/bootstrap-wysiwyg/

 

5、wangEditor

js和css实现

优点:轻量简洁,最重要的是开源且中文文档齐全。设计的UI漂亮。

插件基本能满足需求,本人推荐使用。

http://www.wangeditor.com/index.html

 

6、CKEditor

功能强大,使用较多,可以看他们官网的例子,马上就有感觉。

优点:编辑能力极强,基本和word差不多了。看起来界面极其优秀的一款。

缺点:网站访问速度一般,文档英文,需要花时间开发。

http://ckeditor.com/

 

7、tinymce

支持图片在线处理,插件多,功能强

编辑能力优秀,界面好看。

同样文档为英文,开发需要花时间。

https://www.tinymce.com/

 

使用之前需要考虑的点:

1需要插件,是否需要很多的插件,还是说简单的那些功能就行了。

2界面考虑,看你喜欢那个界面了。

3图片是否需要上传图片服务器。

4文档如果为英文是否会影响开发。

5支持浏览器类型和版本。

在线二维生成接口

http://www.liantu.com/pingtai/

win7远程桌面连接怎么控制关机

远程桌面能带来很大的方便,需要使用其他电脑也不用东奔西走了,可以操纵本机一样操作其他电脑,但是需要对远程电脑进行关机或重启时就遇到了问题,点击开始只有注销和断开。
方法一、在远程桌面窗口下使用ALT+F4即可实现关机、注销 
方法二、使用任务管理器,
              在任务栏右键—任务管理器 在关机(U)中可以选择 
              备注:如果电脑加入域的话可能看不到这个选项
方法三、使用shutdown 命令  
              关机:shutdown -s -f -t 0 
              注销:shutdown -r -f -t 0 
              在开始—运行中或开始—运行—CMD中使用此命令即可

添加修改删除后,使用一条SQL语句更新分类表中对应的用户总数count()

-----------------------------------------

select a.id ,ifnull(b.cnt,0) as cnt from bc_company as a left join (
	select company_id,count(company_id) as cnt from bc_user where status = 1 group by company_id
) as b on a.id = b. company_id


-------------------------------------------------------
update bc_company a,(
	select a.id ,ifnull(b.cnt,0) as cnt from bc_company as a left join (
		select company_id,count(company_id) as cnt from bc_user where status = 1 group by company_id
	) as b on a.id = b. company_id
)b 
set a.user_count=b.cnt where a.id=b.id;

-------------------------------------------------------

WinRAR v5.50 64位 32位 官方原版已注册破解版 无广告无修改

WinRAR v5.50 64位 官方原版已注册破解版是一款在官方原版的基础上注册破解winrar64位去广告版,安装即可使用,不需要使用注册码及key文件,非常简单易用,欢迎有需要的朋友们前来下载使用。

阅读详细 »

带复选框的下拉框chartQuota

阅读详细 »

在线代码编辑器 CODEMIRROR 配置说明

CodeMirror是一款在线的支持语法高亮的代码编辑器。官网: http://codemirror.net/

下载后,解压开得到的文件夹中,lib下是放的是核心库和核心css,mode下放的是各种支持语言的语法定义,theme目录下是支持的主题样式。一般在开发中,添加lib下的引用和mode下的引用就够了。

阅读详细 »

php 静态方法为什么不能调用this

一般方法调用,都是使用$obj->method();
这里的method方法中 $this 很明显就是 $obj
但是静态方法调用,我们一般使用 
Object::method();
没有进行实例化,所以根本没有$this对象

微信小程序 文本换行
实现转义/n 换行符

微信小程序<text>和<view>标签并不能让文本自动换行,
微信小程序也不支持 <br/>换行,很纠结。

处理方法:
替换<br/>标签 为 \n
使用 css 属性 :white-space:pre-wrap 

<view style=”white-space:pre-wrap”>
文本保留空格和回车 
</view>

微信小程序自定义组件wxss不生效,如何解决???

使用微信web开发工具开发微信小程序 自定义组件时。组件的 wxss 样式 不生效,很头疼。如何解决???

自定义的组件wxss不生效如何解决?
1.在开发者工具调试器中输入openVendor并回车;
2.开发者工具会打开一个文件夹,请删除这个文件夹下的所有文件;
3.关闭并重启开发者工具,看看这个问题是否还存在。

http怎么做自动跳转https?

使用.htacces文件配http自动跳转https

在网站配置SSL证书后,启用https访问的时候需要配置 http自动跳转https 方法,这里建议修改.htacces文件

在网站跟目录下创建  .htacces  文件。

修改文件内容为:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [R,L]
#RewriteRule ^(.*)$ https://www.你的域名.com/$1 [R,L]

阅读详细 »

Fiddler实现手机抓包

手机用fiddler抓包

电脑最好是笔记本,这样能和手机保持统一局域网内;其他不多说,直接说步骤了。

一.对PC(笔记本)参数进行配置

   1. 配置fiddler允许监听到https(fiddler默认只抓取http格式的)

         打开Fiddler菜单项Tools->TelerikFiddler Options->HTTPS

         勾选CaptureHTTPS CONNECTs,点击Actions,

         勾选Decrypt HTTPS trafficIgnore servercertificate errors两项,点击OK(首次点击会弹出是否信任fiddler证书和安全提示,直接点击yes就行),见图:

阅读详细 »

全局事件ajaxStart、ajaxStop不执行

最近一直都在研究【锋利的jQuery】,确实是一本好书,受益匪浅。但由于技术发展及版本更新等原因,里面还是有些坑需要踩的。

比如:第六章七节中提到的全局事件ajaxStart、ajaxStop照着案例敲结果并不会执行。

在查阅资料后,发现原来在jquery1.9+版本以后,ajax全局事件需绑定到document对象上才能触发。

下面是各版本不同写法: 阅读详细 »

Ztree自动触发第一个节点的点击事件

重点在这

setting.callback.onClick(null, roletree.setting.treeId, node);

阅读详细 »

mysql 多表关联删除 MySQL跨表关联删除 MySQL根据查询条件删除多表数据

两张表关联删除:

DELETE a,b FROM table1 a
INNER JOIN  table2 b
ON a.id = b.aid
WHERE a.id = '1'
//或者也可以
DELETE a,b FROM table1 a,table2 b
WHERE a.id = b.aid
AND a.id = '1'
 阅读详细 »

MySQL触发器使用详解

MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。

创建触发器
在MySQL中,创建触发器语法如下:

代码如下:


CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

阅读详细 »

thinphp5 用input()方法接受 get/post数组 报错问题

症状:

<form>
<input name="id[]" value="1"/>
    <input name="id[]" value="2"/>
    <input name="id[]" value="3"/>
    <input name="id[]" value="4"/>
<button type="submit">提交</button>
</form>

如上表单,提交的id PHP再用 $_POST[‘id’] 接收后,会得到一个数组。

再用tp5 的   input(‘id’); 接受的时候,会报错。

后来参看手册后,发现tp5  使用 input(‘id/a‘) ; 可解决。 阅读详细 »

php环境wamp2.5下载地址

php环境wamp2.5下载地址

https://sourceforge.net/projects/wampserver/files/WampServer%202/Wampserver%202.5/

WampServer 2.5 – 32 and 64 bits

Be sure that you have installed Visual C++ Redistributable for Visual Studio 2012 : VC11 vcredist_x64/86.exe
http://www.microsoft.com/en-us/download/details.aspx?id=30679

Don’t Use previous WampServer Extensions/Addons. 
There are no more compatible with the new wampserver version’s (VC11)

Apache     : 2.4.9
MySQL      : 5.6.17
PHP        : 5.5.12
PHPMyAdmin : 4.1.14
SqlBuddy   : 1.3.3
XDebug     : 2.2.5

Source: readme.txt, updated 2014-05-01