调用远程 API
场景:用户点击插件工具栏按钮后,调用某个 REST API(如公开接口),将返回的 JSON 或纯文本解析后通过 HUD/弹窗展示,或追加到当前焦点笔记的评论中。
前提:已按 网络请求 在插件内加入完整的 base64.js 与 network.js,并在入口中先 JSB.require('base64') 再 JSB.require('network')。以下示例均使用其中的 MNNetwork.fetch、res.json()、res.text()。
步骤:
- 在工具栏命令对应的 selector 中调用封装:
await MNNetwork.fetch(url, options)得到响应,在 try 中用res.json()(JSON)或res.text()(纯文本)取结果 - 将结果用
showHUD/alert展示,或通过focusNote.appendTextComment/appendMarkdownComment写入笔记 - 在 catch 中处理错误(如
alert("请求失败: " + err))
示例一:GET 并显示 HUD
Section titled “示例一:GET 并显示 HUD”调用公开接口获取一句话,解析 JSON 后用 HUD 显示。使用 网络请求 中的 MNNetwork 与 base64.js。
// 入口中已执行:JSB.require('base64'); JSB.require('network');
async function fetchQuoteAndShow() { try { var res = await MNNetwork.fetch("https://api.quotable.io/random"); var obj = res.json(); if (!obj) { Application.sharedInstance().showHUD("响应不是有效 JSON", self.window, 2); return; } var text = (obj.content || obj.quote || JSON.stringify(obj)).substring(0, 80); Application.sharedInstance().showHUD(text, self.window, 3); } catch (err) { Application.sharedInstance().alert("请求失败: " + err); }}将 fetchQuoteAndShow 绑定到工具栏按钮的 selector(如 fetchQuote:),在 fetchQuote: 中调用即可。
示例二:GET 后写入笔记评论
Section titled “示例二:GET 后写入笔记评论”将 API 返回的文本追加到当前焦点笔记的评论中,使用 res.json() 取内容后通过 UndoManager 写入。
async function fetchAndAppendToNote() { var studyController = Application.sharedInstance().studyController(self.window); if (!studyController) return; var focusNote = studyController.notebookController.focusNote; if (!focusNote) { Application.sharedInstance().alert("请先选中一条笔记"); return; }
try { var res = await MNNetwork.fetch("https://api.quotable.io/random"); var obj = res.json(); if (!obj) return;
var text = obj.content || obj.quote || JSON.stringify(obj); var topicid = focusNote.notebookId; UndoManager.sharedInstance().undoGrouping("追加 API 结果", topicid, function () { focusNote.appendTextComment(text); }); Application.sharedInstance().refreshAfterDBChanged(topicid); Application.sharedInstance().showHUD("已追加到笔记", self.window, 2); } catch (err) { Application.sharedInstance().alert("请求失败: " + err); }}示例三:带 API Key 的请求
Section titled “示例三:带 API Key 的请求”从 NSUserDefaults 读取保存的 API Key,通过 options.headers 传入。使用 网络请求 中的 MNNetwork.fetch(url, { headers: { ... } })。
async function fetchWithAPIKey() { var apiKey = NSUserDefaults.standardUserDefaults().objectForKey("my_addon_api_key"); if (!apiKey) { Application.sharedInstance().alert("请先在设置中填写 API Key"); return; }
try { var res = await MNNetwork.fetch("https://api.example.com/data", { headers: { "Authorization": "Bearer " + apiKey, "Accept": "application/json" } }); var obj = res.json(); if (NSJSONSerialization.isValidJSONObject(obj)) { Application.sharedInstance().showHUD("获取成功", self.window, 2); // 使用 obj... } } catch (err) { Application.sharedInstance().alert("请求失败: " + err); }}API Key 的保存与读取见 插件设置页。保存后可选择调用简单 API 验证 Key 是否有效。
示例四:纯文本响应(res.text())
Section titled “示例四:纯文本响应(res.text())”若接口返回的是纯文本(如 text/plain),用 res.text() 获取字符串。text() 依赖 网络请求 中的 base64.js(需已 JSB.require('base64'))。
async function fetchPlainText() { try { var res = await MNNetwork.fetch("https://example.com/plain"); var str = res.text(); Application.sharedInstance().showHUD(str.substring(0, 100), self.window, 3); } catch (err) { Application.sharedInstance().alert("请求失败: " + err); }}