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

Swift调用Gemini私有API端点遭遇404错误,寻求解决方法

Swift调用Gemini私有API出现404错误

我用Python可以正常调用Gemini私有API获取数据,但Swift端始终无法正常工作。Gemini API文档没有Swift实现示例,排查起来很麻烦,试过用ChatGPT解决也没搞定。

我的Swift代码如下:

func generateNonce() -> String {
    let timestamp = String(Int(Date().timeIntervalSince1970 * 1000)) // 获取毫秒级时间戳
    let uniqueId = UUID().uuidString // 生成唯一标识符
    // 拼接时间戳和唯一标识符作为nonce
    let nonce = timestamp + uniqueId
    return nonce
}

func signPayload(payload: String, secret: String) -> String {
    if let payloadData = payload.data(using: .utf8), let secretData = secret.data(using: .utf8) {
        var result = [UInt8](repeating: 0, count: Int(CC_SHA384_DIGEST_LENGTH))
        payloadData.withUnsafeBytes { payloadPtr in
            secretData.withUnsafeBytes { secretPtr in
                CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA384), secretPtr.baseAddress, secretData.count, payloadPtr.baseAddress, payloadData.count, &result)
            }
        }
        
        let signatureData = Data(result)
        let signature = signatureData.map { String(format: "%02x", $0) }.joined()
        
        return signature
    } else {
        return ""
    }
}

func base64Encode(payload: String) -> String? {
    if let payloadData = payload.data(using: .utf8) {
        return payloadData.base64EncodedString()
    }
    return nil
}

let apiKey = MyAPIKEY
let apiSecret = MYAPISecret
let baseUrl = "https://api.gemini.com/v1/notionalbalances/usd"
let endpoint = "/v1/notionalbalances/usd"
let account = "primary"

func performAPICall() async throws -> Crypto {
    
    let url = URL(string: baseUrl)!
    
    let nonce = generateNonce()
    let payload = "\(nonce)+\(endpoint)+\(account)"
//    let payload = "[\"request\": \"/v1/notionalbalances/usd\", \"nonce\" : nonce, \"account\" : \"primary\"]"
//    let payload = """{
//        \"request\": \"/v1/notionalbalances/usd\",
//        \"nonce\": \"\(nonce)\",
//        \"account\": \"\(account)\"
//    }"""
    
    let signature = signPayload(payload: payload, secret: apiSecret)

    var request = URLRequest(url:url)
    request.httpMethod = "POST"
    
    request.setValue("text/plain", forHTTPHeaderField: "Content-Type")
    request.setValue("0", forHTTPHeaderField: "Content-Length")
    request.setValue(apiKey, forHTTPHeaderField: "X-GEMINI-APIKEY")
    request.setValue(base64Encode(payload: payload), forHTTPHeaderField: "X-GEMINI-PAYLOAD")
    request.setValue(signature, forHTTPHeaderField: "X-GEMINI-SIGNATURE")
    request.setValue("no-cache", forHTTPHeaderField: "Cache-Control")
    
//    request.setValue(generateNonce(), forHTTPHeaderField: "nonce")
    
    let (data, response) = try await URLSession.shared.data(from: url)
    
    if let httpResponse = response as? HTTPURLResponse {
                print("Status Code: \(httpResponse.statusCode)")
        print("Response Headers: \(httpResponse.allHeaderFields)")
            }
    
    let wrapper = try JSONDecoder().decode(Crypto.self, from: data)
    return wrapper
}

Task {
    var crypto = try await performAPICall()
}

执行后持续收到如下错误:

Status Code: 404
Response Headers: [AnyHashable("Vary"): Origin, AnyHashable("Content-Length"): 111, AnyHashable("Server"): nginx, AnyHashable("Content-Type"): application/json, AnyHashable("Date"): Sat, 30 Sep 2023 16:21:07 GMT]


内容的提问来源于stack exchange,提问作者pythonSwiftDesigner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:28:10