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

