使用URLSession调用Notion API无数据返回,请求排查问题
解决Notion API请求无控制台输出的问题
核心问题分析与修复步骤
1. 请求根本没启动
你定义了makeRequest()函数但完全没调用它,代码执行到这里就结束了,请求根本没发出去,自然没有任何输出。在代码末尾加上启动语句:
makeRequest()
2. 缺少Notion API强制要求的请求头
Notion API必须携带两个关键请求头才能正常响应:
Authorization: 格式为Bearer <你的API Key>Notion-Version: 指定兼容的API版本(比如2022-06-28,需和官方文档版本匹配)
修改请求创建逻辑,添加这两个头:
var request = URLRequest(url: endpoint) request.addValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization") request.addValue("2022-06-28", forHTTPHeaderField: "Notion-Version") // 用带请求头的request创建task let task = URLSession.shared.dataTask(with: request) { data, response, error in // ... 原有逻辑 }
3. Page结构体和Notion返回的JSON结构不匹配
Notion返回的title不是直接的字符串,是嵌套的rich_text数组结构,你当前的结构体解码肯定失败。修正结构体:
struct Page: Codable { let id: String let properties: Properties } struct Properties: Codable { let title: TitleField } struct TitleField: Codable { let title: [RichText] } struct RichText: Codable { let plain_text: String }
解码后可以通过pageData.properties.title.title.first?.plain_text拿到标题文本。
4. 错误的递归调用搞乱逻辑
你在响应处理的最后直接调用makeRequest(),会导致请求无限循环,完全没必要,直接删掉这个递归调用。
5. 解码错误只给模糊提示
当前catch块只打印“could not parse json data”,根本没法定位问题,改成打印具体错误:
catch { print("JSON解码失败: \(error.localizedDescription)") print("错误详情: \(error)") }
6. 强制解包有崩溃风险
把print(String(data: apiData, encoding: .utf8)!)改成安全的可选绑定:
if let responseString = String(data: apiData, encoding: .utf8) { print("响应内容:\n\(responseString)") } else { print("无法将响应数据转为字符串") }
修正后的完整代码
import Foundation struct Page: Codable { let id: String let properties: Properties } struct Properties: Codable { let title: TitleField } struct TitleField: Codable { let title: [RichText] } struct RichText: Codable { let plain_text: String } let endpoint = URL(string: "https://api.notion.com/v1/pages/8efc0ca3d9cc44fbb1f34383b794b817") let apiKey = "… redacted …" let session = URLSession.shared func makeRequest() { guard let endpoint = endpoint else { print("无效的Endpoint URL") return } var request = URLRequest(url: endpoint) request.addValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization") request.addValue("2022-06-28", forHTTPHeaderField: "Notion-Version") let task = URLSession.shared.dataTask(with: request) { data, response, error in if let taskError = error { print("请求失败: \(taskError.localizedDescription)") return } guard let unwrapData = data else { print("未获取到响应数据") return } // 打印原始响应(调试用) if let responseString = String(data: unwrapData, encoding: .utf8) { print("原始响应:\n\(responseString)") } // 解码数据 do { let decoder = JSONDecoder() let pageData = try decoder.decode(Page.self, from: unwrapData) let pageTitle = pageData.properties.title.title.first?.plain_text ?? "无标题" print("解码成功 - 页面ID: \(pageData.id),标题: \(pageTitle)") } catch { print("JSON解码失败: \(error.localizedDescription)") print("错误详情: \(error)") } // 打印状态码 if let httpResponse = response as? HTTPURLResponse { print("HTTP状态码: \(httpResponse.statusCode)") } } task.resume() } // 启动请求 makeRequest()
内容的提问来源于stack exchange,提问作者aor11
相关产品推荐
相关产品推荐

