Extension bbs api
注意
- 需要RWPP版本: 1.5.1
资源管理器 API 协议
在1.5.1版本中,RWPP提供了一套基于HTTP的资源管理器API协议,用于在网络中搜索资源。
添加
RWPP默认提供铁锈盒子的协议,你也可以通过扩展来添加其他的协议。
准备
了解 okhttp 库的使用方法。
通过net:getBbsProtocols()获取协议列表。
1. 资源类型枚举 ResourceType
定义请求的资源类型:
2. 网络资源信息类 NetResourceInfo
表示从服务端返回的资源元数据:
| 属性名 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
title |
String |
是 | 无 | 资源标题 |
description |
String? |
否 | null |
资源描述(可选) |
bbsUrl |
String? |
否 | null |
资源详情页链接 |
downloadUrl |
String? |
否 | null |
直接下载链接 |
version |
String? |
否 | null |
资源版本号 |
author |
String? |
否 | null |
作者信息 |
imageBytes |
ByteArray? |
否 | null |
预览图二进制数据 |
3. BBS 协议类 BBSProtocol
定义与 BBS 服务端交互的协议:
| 属性名 | 类型 | 描述 |
|---|---|---|
url |
String |
服务端 API 地址 |
name |
String |
协议名称(如 "铁锈盒子") |
requestBodyProvider |
(page: Int, keyword: String, type: ResourceType) -> RequestBody |
请求体构建函数: - page: 分页页码- keyword: 搜索关键词- type: 资源类型(Mod/Map)返回一个 RequestBody 对象 |
resultParser |
(Response) -> Array<NetResourceInfo>? |
响应解析函数: - 输入 HTTP 响应对象 - 输出 NetResourceInfo 数组(解析失败返回 null) |
协议工作流程
- 客户端通过
requestBodyProvider构建请求体(含分页、关键词、资源类型) - 服务端返回 HTTP 响应
- 客户端通过
resultParser解析响应为结构化资源数据(NetResourceInfo数组)
下面是一项示例:
local Json = java.import('com.eclipsesource.json.Json')
-- 绑定 Java 类
local Result = java.import('kotlin.Result')
local MultipartBody = java.import("okhttp3.MultipartBody")
local NetResourceInfo = java.import("io.github.rwpp.net.NetResourceInfo")
local ResourceType = java.import("io.github.rwpp.net.ResourceType")
local RTSBoxProtocol = BBSProtocol(
"https://www.rtsbox.cn/api/search_bbs.php",
"铁锈盒子",
-- 构建请求的 Lambda(转换为 Lua 函数)
function(page, keyword, type)
local builder = MultipartBody.Builder()
builder:setType(MultipartBody.FORM)
-- 根据 type 判断 bbs_id
local bbs_id = (type == ResourceType.Mod) and "4" or "5"
builder:addFormDataPart("bbs_id", bbs_id)
builder:addFormDataPart("keyword", keyword)
builder:addFormDataPart("page", tostring(page))
return builder:build()
end,
-- 解析响应的 Lambda(转换为 Lua 函数)
function(response)
local ok, result = pcall(function()
local body = response.body():string() -- 获取响应体字符串
local jsonBody = Json:parse(body):asObject()
local arr = jsonBody:get('data'):asArray() -- 获取 JSON 数组
local resources = java.array(NetResourceInfo, arr:size())
-- 遍历 JSON 数组
for i, data in ipairs(arr) do
resources[i] = NetResourceInfo(
data.title or "???",
data.bbsurl or "???",
data.downurl or "???"
)
end
return resources
end)
return ok and Result:success(result) or Result:failure(tostring('failed'))
end
)
net:getBbsProtocols():add(RTSBoxProtocol) -- 注册协议