zoukankan      html  css  js  c++  java
  • openwrt 里LUA程序怎么获取POST数据?

    https://www.zhihu.com/question/31579325

    作者:齐葛
    链接:https://www.zhihu.com/question/31579325/answer/283425839
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    uhttpd + Fast-CGI的开发要求:

    1. 安装uhttpd包(https需要加装“uhttpd-mod-tls”和“px5g”);
    2. 修改uhttpd配置文件“/etc/config/uhttpd”,将Lua作为“interpreter”;
    3. Lua脚本写到“/www/cgi-bin/”目录下,但是不带扩展名,且可执行;
    4. Fast-CGI要求Lua脚本必须首先使用“io.write()”输出“Content-type: text/html ”
    5. “/www/cgi-bin/”目录下的脚本可以调用“/usr/lib/lua/”目录下的自定义模块;
    6. Lua环境已经就绪。

    “读取GET和POST数据”为例,全部使用默认值的情况下,如何具体实现:

    第一步:使用“opkg update”更新“.ipk”包的源,然后使用“opkg install uhttpd”安装;

    第二步:使用“vi /etc/config/uhttpd”,在“config uhttpd main”下添加一行

    list interpreter ".lua=/usr/bin/lua”

    第三步:建立目录“/www/cgi-bin”,并增加“+x”属性;

    root@OpenWrt:~# mkdir -p /www/cgi-bin/
    root@OpenWrt:~# chmod +x /www/cgi-bin/

    建立响应文件,并增加“+x”属性;

    root@OpenWrt:~# touch /www/cgi-bin/webservice
    root@OpenWrt:~# chmod +x /www/cgi-bin/webservice

    将文件“/www/cgi-bin/webservice”内容修改为:

    #!/usr/bin/lua
    local WebService = require 'WebService'
    WebService.Run()

    第四步:建立Lua模块文件(不再要求“+x”属性),并读取参数,返回响应:

    root@OpenWrt:~# touch /usr/lib/lua/WebService.lua

    将其内容修改为如下内容:

    local WebService = {}
    
    function WebService.Run()
        local client = os.getenv("REMOTE_ADDR")
        local GET = os.getenv("QUERY_STRING")
        local POST = nil
        local POSTLength = tonumber(os.getenv("CONTENT_LENGTH")) or 0
        if (POSTLength > 0) then
            POST = io.read(POSTLength)
            --POST = io.read("*a")
        end
    
        -- Fast-CGI+HTTP require HEADER
        -- enable cache
        --io.write("Content-type: text/html
    
    ")
        -- disable cache, especially for Internet Explorer
        io.write("Content-type: text/html
    Pragma: no-cache
    
    ")
    
        local reply = string.format("Client %s said: url: [%s], data: [%s]
    ", client or '-', GET or '-', POST or '-')
        io.write(reply)
    end
    
    return WebService

    第五步:重启“uhttpd”服务(为了让更改的/etc/config/uhttpd生效):

    root@OpenWrt:~# /etc/init.d/uhttpd restart

    第六步:使用浏览器测试:

    使用浏览器访问如下地址:

    http://<openwrt_ipaddr>/cgi-bin/webservice?author=qige

    这里假设OpenWrt开发板的IP为192.168.1.24:

    http://192.168.1.24/cgi-bin/webservice?author=qige

    最终效果如下图:

    通过cUrl模拟POST提交通过form表单POST提交的浏览器结果

    注意:

    1. POST数据可以由curl、Python requests等进行模拟提交,也可以自制如:<form action="/cgi-bin/webservice" method="POST">提交;
    2. 根据Fast-CGI要求,必须要先使用“io.write()”输出http协议头部;再根据http协议的要求,头部和内容之间必须使用“ ”来隔开。因此Lua脚本必须先输出头部“Content-type: text/html ”,再输出其它内容;
    3. 如果“不需要缓存”,输出立即过期,则修改头部内容为“Content-type: text/html Pragma: no-cache ”;
    4. 让uhttpd开机自动启动,需要执行“/etc/init.d/uhttpd enable”;
    5. 需要将接收到的数据输出到串口,可以再安装一个“coreutils-stty”包用于控制串口波特率
    root@OpenWrt:~# opkg install coreutils
    root@OpenWrt:~# opkg install coreutils-stty

    再将以下内容添加到Lua模块的适当位置,并调用此函数即可:

    function WebService.uartWrite(msg)
        local uartConfig = 'stty -F /dev/ttyS0 raw speed 9600
    '
        os.execute(uartConfig)
    
        local cmd = string.format("echo '%s' > /dev/ttyS0
    ", msg or '')
        os.execute(cmd)
    end
  • 相关阅读:
    Regular进阶: 几点性能优化的建议
    总结常见的违背Rest原则的接口设计做法
    如何进行用户访谈更容易获得全面而有效的信息
    关于以太坊智能合约在项目实战过程中的设计及经验总结(2)
    关于以太坊智能合约在项目实战过程中的设计及经验总结(1)
    字节码执行方式--解释执行和JIT
    Redis数据库结构与读写原理
    移动端工程架构与后端工程架构的思想摩擦之旅(2)
    类文件结构与javap的使用
    JVM垃圾收集器(1)
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/10787233.html
Copyright © 2011-2022 走看看