作者:糖果

LUA代码:

list = {1,5,3,2,9,3,6}
len=#list

for i=1,len 
  max = list[i]
  for j=i+1, len do  
    if list[j]>max then 
      tmp=list[j] 
      list[j]=max
      list[i]=tmp
      max=tmp

for item in *list
  print(item)

MoonScript代码

local list = { 
  1,  
  5,  
  3,  
  2,  
  9,  
  3,  
  6
}
local len = #list
for i = 1, len do
  local max = list[i]
  for j = i + 1, len do
    if list[j] > max then
      local tmp = list[j]
      list[j] = max 
      list[i] = tmp 
      max = tmp 
    end 
  end 
end
for _index_0 = 1, #list do
  local item = list[_index_0]
  print(item)
end

作者:糖果

Lapis的util库有对cjson封装,而我们想更直接的调用CJSON的方法,而不想依赖的封装。

我们首先实现一个MoonScript写文件的代码:

写文件:


write_data = (var, rule)->
    path = "/home/xxx"  
    file = io.open(path,"aw")
    if file==nil then
        return

    ret = file\write(rule)
    file\close()
    return(t)

访问接口:

    restyhttp = require "resty.http"
    httpc = restyhttp.new()
    res, err = httpc\request_uri("http://0.0.0.0/getjson")
    jsonbody = ""
    if res.status == ngx.HTTP_OK 
      jsonbody = res.body
    else 
      jsonbody = nil 

对JSON数据DECODE:

    write_data(0, jsonbody)
    t = json.decode(jsonbody)
    tjson = json.decode(t['message'])
    ngx.say(util.serialise_value(tjson))
    ""

作者:糖果

在OpenResty中发起HTTP请求,一般情况下,有两种方式: 1.通过内部Proxy。 2.使用RESTY-HTTP库发起访问。

Lapis使用的是interal proxy,之前文章有提到,下面提到的是RESTY-HTTP的MoonScript调用 实现。

RESTY-HTTP安装

实际RESTY-HTTP的主要实现就是两个lua文件, http_headers.lua和http.lua这两个文件。 将文件复制到/usr/local/openresty/lualib/resty下即可使用,再引用http.lua时注意一下 的是Lapis也有一个同名文件,需要注意一下冲突。

MoonScript代码:

    http = require "resty.http"
    httpc = http.new()
    res, err = httpc\request_uri("http://www.baidu.com")
    if res.status == ngx.HTTP_OK 
      return res.body
    else 
      return "nil"   

LUA代码:

    ["/testcase"] = function(self)
      local restyhttp = require("resty.http")
      local httpc = restyhttp.new()
      local res, err = httpc:request_uri("http://www.baidu.com")
      if res.status == ngx.HTTP_OK then
        return res.body
      else
        return "nil"
      end
    end

MoonScript和LUA代码几乎没太大区别,因为request_uri请求中使用的是域名,所以需要 修改conf文件。

nginx.conf配置

    location / {
            resolver 8.8.8.8;
    }            

RESTY-HTTP与CJSON不同,并没有涉及到任何so库的生成,http_headers.lua和http.lua这 两个文件也是在Makefile来实现的,使用的是install命令-d参数,相当于在cp过程中,如果目标位置没 有相应的文件夹就创建一个文件夹。

Makefile

OPENRESTY_PREFIX=/usr/local/openresty

PREFIX ?=          /usr/local
LUA_INCLUDE_DIR ?= $(PREFIX)/include
LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)
INSTALL ?= install
TEST_FILE ?= t

.PHONY: all test install

all: ;

install: all
        $(INSTALL) -d $(DESTDIR)/$(LUA_LIB_DIR)/resty
        $(INSTALL) lib/resty/*.lua $(DESTDIR)/$(LUA_LIB_DIR)/resty/