You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:56:08