库路径
dialog(package.path) dialog(package.cpath)
|
/data/data/?.lua; /sdcard/TouchSprite/lua/?.lua; /sdcard/TouchSprite/lua/?.luac; /data/data/com.touchsprite.android/TouchSprite/?.lua; /data/data/com.touchsprite.android/files/tslibs/?.lua; /data/data/com.touchsprite.android/files/tslibs/?/?.lua;
|
/data/data/?.so; /data/data/com.touchsprite.android/files/tslibs/?.so; /data/data/com.touchsprite.android/files/plugin/?.so; /data/data/?.so; /sdcard/TouchSprite/lua/?.so;
|
关于http.post 文件
触动有三个地方提供了 http 相关的操作。
TSLib
str = httpPost(url,data,options) ``` 遗憾的是,这里只能传输 data 为字符串类型的数据。
```lua local url = 'http://www.baidu.com' data = "hello world", options = { tstab = 1, timeOut = 10, urlEnCode = true } local str = httpPost(url, data, options)
|
这个生成的内容如下:
Content-Length: 11 Content-Type: application/x-www-form-urlencoded TE: trailers Host: 42.192.43.15:8989 Connection: close, TE User-Agent: LuaSocket 3.0-rc1
hello world
|
很遗憾,我们不能指定头部等信息,Content-Type
也是固定的。
ts.so
这个就可以指定头部,和直接用 lua 表来进行作为参数了。
但是 body 必须是 table 类型,会转换成 query 形式,那我要传 json 的话怎么办?没办法。
函数签名:
status_resp, header_resp,body_resp = ts.httpPost(url,header_send,body_send,encode)
status_resp, header_resp,body_resp = ts.httpPost(url,tab)
|
安卓是把几个参数放在了一个 table 处理,这里 header_send, body_send 都是表。
iOS
local ts = require("ts") header_send = {typeget = "iOS"} body_send = { ["username"] = "aa", ["password"] = "1234" } ts.setHttpsTimeOut(60) code, status_resp, body_resp = ts.httpsPost("https://www.baidu.com", header_send, body_send)
|
Android
local ts = require("ts") data = { tstab = "tstab", header_send = {typeget = "android"}, body_send = {id = "687"}, format = "gbk" } code, header_resp, body_resp = ts.httpsPost("http://whois.pconline.com.cn/ip.jsp", data)
|
但是这个函数生成的内容,也是坑的,字段信息居然莫名其妙:
POST / HTTP/1.1 Host: 42.192.43.15:8989 Accept: */* typeget: android t-Type:application/x-www-form-urlencoded;charset=UTF-8;Content-Length: Content-Length: 6 Content-Type: application/x-www-form-urlencoded
id=687
|
我们可以指定头信息,但指定 Content-Type
没有卵用的;但是 body_send 却无法变更,只能是 table 格式,如果不是 table 格式,那就会给你变成 GET 请求,坑吧?
tsnet.so
这个高级库,需要购买VIP才能用,或者是IOS 专业版,放弃他。
require("tsnet") status, header, content = http.post( "https://whois.pconline.com.cn/ip.jsp", { headers = {aaa = 123, cd = 12}, params = {aaa = 111, bbb = 222}, opts = {charset = "gbk"} } )
|
这个也是把 params 转成 query 形式,我要传 json 怎么办呢?
这个就只能是不带 params 参数,postdata 来手撸格式了。
但这几个都没有解决一个问题:对于文件是如何处理的?是将文件直接传递文件描述符,还是需要手动进行转换成分段的形式进行传输呢?
问题的解决
tsnet.so
使用 ltn12, multipart-post 来解决。
multipart-post 用来将文件封装成 multipart 格式,然后调用 tsnet 的API进行上传:
require("tsnet") local enc = (require "multipart-post").encode
function uploadfile(url, filepath) local body, boundary = enc {file = {data = io.open(filepath)}} local headers = { ["content-length"] = #body, ["content-type"] = string.format("multipart/form-data; boundary=%s", boundary) } print(body) return http.post( url, { headers = headers, params = body, opts = {charset = "gbk"} } ) end
status, header, content = uploadfile("http://oss.888ce.cn:8081/mz/oss/pic/upload/scriptImg", "1.png") dialog(status) dialog(content)
|
ts.so
这个其实也无法解决问题,用 body_send 必须是 table 格式。
require("ts") local enc = (require "multipart-post").encode
function uploadfile(url, filepath) local body, boundary = enc {file = {data = io.open(filepath)}} local headers = { typeget='android', ["content-length"] = #body, ["content-type"] = string.format("multipart/form-data; boundary=%s", boundary) }
return ts.httpPost( url, { tstab='tstab', header_send = headers, body_send = body, format = 'gbk' } ) end status, header, content = uploadfile("http://oss.888ce.cn:8081/mz/oss/pic/upload/scriptImg", "1.png")
|
Socket 模块
没办法了,手撸吧。