如何在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
相关产品推荐
相关产品推荐

