云功能发布请求未正确向 IOS 应用程序发送错误消息

Posted

技术标签:

【中文标题】云功能发布请求未正确向 IOS 应用程序发送错误消息【英文标题】:Cloud Function post request not sending error message properly to IOS app 【发布时间】:2021-03-12 12:38:33 【问题描述】:

我有一个 ios 应用程序从谷歌云函数接收 json 数据。

在没有错误的情况下,数据被检索并完美运行。

但是,当云函数返回错误时,下面的函数会将 error 识别为 nil

客户:

func initialize() 

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = try? JSONSerialization.data(withJSONObject: json)
        let task = URLSession.shared.dataTask(with: request, completionHandler:  [weak self] (data, response, error) in
            
            guard let response = response as? HTTPURLResponse,
                response.statusCode == 200,
                let data = data,
                let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any],
                let clientSecret = json["clientSecret"] as? String,
                let publishableKey = json["publishableKey"] as? String else 
                
                ///////////   
               //ERROR is not being recognized
                /////////

           let message = error?.localizedDescription ?? "Failed to decode response from server."
           print("Error loading page: \(message)")
                    return
       
)
task.resume()

客户端输出:

无法解码来自服务器的响应。

服务器:

firebase.functions().httpsCallable('myFunction')(message)
    .then(result => 
    // this works perfectly and is recognized by the swift function //
    res.send(publishableKey: publishableKey, clientSecret: clientSecret);
)
.catch(err => 
    // this is not recognized by the swift function //
     console.log(err) // full of data
    return res.status(400).send(error: err);
);

日志(错误情况):

函数执行耗时 240 毫秒,完成状态码:400

【问题讨论】:

【参考方案1】:

如果您的请求失败,我认为您的错误将进入响应参数,您必须对其进行解码。我认为只有在无法访问服务器或函数不存在时,错误参数才会不同于 nil。所以基本上在 else 子句中,你必须在响应参数中搜索错误。

【讨论】:

所以你的说法是从云函数发送一个 JSON 对象,每个案例成功和错误的参数都相同?我想我向每个 json 对象添加错误,如果没有错误,则用 nil 填充它。 我认为客户端正在解释“return res.status(400).send(error: err);”作为响应而不是错误。它进入 else 子句,因为它无法解码 json["clientSecret"] 和 json["publishableKey"] 好的,让我测试一下。我觉得你是对的。

以上是关于云功能发布请求未正确向 IOS 应用程序发送错误消息的主要内容,如果未能解决你的问题,请参考以下文章

向 iOS 发送推送通知的问题,(云功能)

使用 firebase 云功能向非谷歌服务器发送 GET 请求

Angular HttpClient 的发布请求未向服务器发送正确的数据

使用 firebase 云功能向非谷歌服务器发送 POST 请求

使用实时数据库的云功能发送通知的问题

使用 iOS 中的社交框架向 Facebook 朋友发送消息或应用请求