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

如何在Swift中正确格式化OpenAI API请求?

如何在Swift中正确格式化OpenAI API请求?

嗨,我看了你的问题,你遇到的错误根源是用错了Swift的字典语法——Swift里的字典字面量是用[Key: Value]来定义的,而不是像JSON或者curl里的{key: value}写法,这就是那些带{}的行报错的原因。另外还有个小细节:你的temperature是Double类型,直接传数值就行,不需要转成String,OpenAI API接受数值类型的参数。

我把你的代码完全修正好了,还补充了请求发送和响应处理的完整逻辑,你可以直接参考:

let openAiUrl = URL(string: "https://api.openai.com/v1/chat/completions")!
var request = URLRequest(url: openAiUrl)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// 记得替换成你的实际API密钥
let openAiApiKey = "YOUR_API_KEY_HERE"
request.addValue("Bearer \(openAiApiKey)", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"

// 用Swift标准的字典语法替换JSON风格的{}写法
let httpBody: [String: Any] = [
    "model": "gpt-4o",
    "messages": [
        [
            "role": "user",
            "content": [
                [
                    "type": "text",
                    "text": "Write a haiku about weightlifting"
                ]
            ]
        ]
    ],
    "temperature": temperature, // 直接传入Double变量,无需转String
    "max_tokens": 2048,
    "top_p": 1,
    "frequency_penalty": 0,
    "presence_penalty": 0,
    "response_format": [
        "type": "text"
    ]
]

// 必须把字典序列化为JSON Data才能作为请求体
do {
    request.httpBody = try JSONSerialization.data(withJSONObject: httpBody)
} catch {
    print("JSON序列化失败: \(error.localizedDescription)")
    return
}

// 发送请求并处理响应
URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("请求出错: \(error.localizedDescription)")
        return
    }
    
    guard let data = data else {
        print("未收到响应数据")
        return
    }
    
    do {
        if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] {
            // 这里可以提取你需要的响应内容,比如生成的俳句
            if let choices = jsonResponse["choices"] as? [[String: Any]],
               let message = choices.first?["message"] as? [String: Any],
               let content = message["content"] as? String {
                print("生成的内容:\n\(content)")
            }
        }
    } catch {
        print("响应解析失败: \(error.localizedDescription)")
    }
}.resume()

我再给你拆解下关键的修改点:

  • 所有嵌套的结构(比如用户消息、response_format)都改成了Swift的[Key: Value]字典格式,替换掉原来的{}
  • 移除了temperature的String()转换,直接传入Double变量,避免API参数类型不匹配
  • 补充了字典转JSON Data的代码,这是POST请求必须的步骤,你之前的代码里漏掉了这部分
  • 增加了完整的请求发送和响应解析逻辑,方便你直接测试运行

另外,我保留了和你curl请求完全一致的content数组结构,确保API能正确识别请求内容,不会因为结构不一致导致报错。

备注:内容来源于stack exchange,提问作者BriteKnight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:28:01