此库封装了因特网卡的功能。
另请参阅因特网组件以了解更多底层功能(例如查询HTTP可用性以及TCP功能)。
internet.request(url: string[, data: string or table[, headers: table[, method: string]]]): function
method
参数可以显式指定为GET、POST或PUT等值。internet.request(url, {some = "variable", another = 1})
会发送 some=variable&another=1
。internet.request("https://example.com", "put data", {}, "PUT")
。
返回的函数是对结果块的迭代器,使用方式:for chunk in internet.request(...) do stuff() end
注意,此方法也支持HTTPS。所以只需要用internet.request("https://example.com")
即可通过HTTPS发送请求。
internet.socket(address:string[, port:number]):table
connect
方法打开一个TCP套接字,并将其封装为一个表,此表提供了与使用filesystem.open
打开的文件相同的方法:read
、write
与close
(还有seek
,但通常会执行失败)。我们更推荐使用internet.open
函数,此函数会将打开的套接字封装进缓冲,与 io.open
函数封装文件的方式相同。internet.open(address:string[, port:number]):table
s:read
和s:write
方法——通常可以与io.open
打开的文件类似对待。通常需要使用s:setTimeout(seconds)
设定缓冲区读取超时时间,以防止操作被无限期阻塞。local internet = require("internet") local handle = internet.open("example.com", 1337) local data = handle:read(10) handle:write("1234") handle:close()
如果你需要HTTP响应码、消息和响应头,这些数据可从内部对象中取回。该对象被存储于返回对象的元表中。
-- https://github.com/kikito/inspect.lua/blob/master/inspect.lua local inspect = require("inspect") local internet = require("internet") local handle = internet.request("https://www.google.com") local result = "" for chunk in handle do result = result..chunk end -- 输出HTTP响应的body -- print(result) -- 从句柄处取得元表,其中包含内部的HTTPRequest对象 local mt = getmetatable(handle) -- response方法取得了HTTP响应码、响应信息和响应头的信息 local code, message, headers = mt.__index.response() print("code = "..tostring(code)) print("message = "..tostring(message)) print(inspect(headers))
下面提供了一个简单的IRC聊天机器人样例,机器人会复读你说的话。样例使用了internet(因特网) API提供的套接字。
--这是一个简易的拆分函数,用于拆分信息 function split(data, pat) local ret = {} for i in string.gmatch(data,pat) do table.insert(ret,i) end return ret end --配置 local nickname = "myircbot" local channel = "#mybotchannel" local net = require("internet") local con = net.open("irc.esper.net",6667) --在此处设定服务器与端口,将会连接到服务器 if(con) then local line,png,linesplt,msgfrom = "" while(true) do line = con:read() --从套接字中读取一行 print(line) linesplt = split(line,"[^:]+") if #linesplt >= 2 and string.find(linesplt[2], "No Ident response") ~= nil then print("JOIN") con:write("USER " .. nickname .. " 0 * :" .. nickname .. "\r\n") --con:write(msg)用于发送信息,con:read()会读取一行 con:write("NICK " .. nickname .. "\r\n") --对IRC而言,请记住在所有信息末尾追加\r\n con:write("JOIN :" .. channel .. "\r\n") elseif linesplt[1] == "PING" or linesplt[1] == "PING " then print("PING") png = split(line,"[^:]+") con:write("PONG :"..png[#png].."\r\n") --对ping作出响应,以保证不会断联 elseif string.find(linesplt[1], "PRIVMSG #") ~= nil then msgfrom = split(linesplt[1],"[^ ]+") msgfrom = msgfrom[3] con:write("PRIVMSG "..msgfrom.." :"..linesplt[2].."\r\n") end end else print("Connection failed.") end
若要获取更高级的使用例,请查看最新版本的OpenComputers提供的IRC客户端程序:irc.lua