Firebase 云函数更改超时
Posted
技术标签:
【中文标题】Firebase 云函数更改超时【英文标题】:Firebase Cloud Functions Change Timeout 【发布时间】:2018-11-30 22:52:03 【问题描述】:我在 android 上使用 Firebase Cloud Functions 库,并使用 getHttpsCallable
调用云函数。
问题是函数需要10-15秒才能将结果返回给客户端,所以客户端抛出异常java.net.SocketTimeoutException: timeout
。
代码
// Create the arguments to the callable function.
Map<String, Object> data = new HashMap<>();
data.put("info", info);
mFunctions.getHttpsCallable(function)
.call(data)
.continueWith(new Continuation<HttpsCallableResult, String>()
@Override
public String then(@NonNull Task<HttpsCallableResult> task)
// This continuation runs on either success or failure, but if the task
// has failed then getResult() will throw an Exception which will be
// propagated down.
if (task.isSuccessful())
String result = (String) task.getResult().getData();
Log.v(Constants.LOG_TAG, result);
return result;
else
// The condition never was true, always logs the exception.
Exception e = task.getException();
Log.e(Constants.LOG_TAG, "Failed to join multiplayer room.", e);
return null;
);
如何更改超时,以便客户端在抛出异常之前等待更多时间?
注意。我没有使用 OkHttp、Retrofit 或默认系统网络功能,我使用 Firebase Cloud Functions 库 (getHttpsCallable
) 来调用该功能。
【问题讨论】:
这个***.com/questions/43223834/…的可能副本 不是真的,我的云功能运行良好,但需要很长时间(这也很好,因为我想要那个)但是客户端(Android 应用程序)抛出异常,而不是服务器,所以我想让客户端等待更多,直到服务器响应。 我认为超时时间为 10 秒,并且无法使用当前的 Firebase API 进行配置。建议你file a feature request。 也许您可以将您的云功能更改为 HTTPS 功能,然后您就可以完全控制如何从您的应用中调用它。 只是添加我的声音,是的,60 秒的超时将非常有用。考虑到其余的 60 秒超时,我发现这条 10 秒规则很奇怪。改变超时的方法会很好。我正在结合使用可调用函数,该函数写入特定节点,我可以在其中获取数据。 【参考方案1】:firebase-functions
16.3.0 版,released 15 Mar 2019,增加了configure the timeout 的功能。
【讨论】:
终于!非常感谢。【参考方案2】:我遇到了同样的问题,因此我使用 OkHttp 而不是 getHttpsCallable 调用 https 函数作为解决方法。 https.onCall的协议是公开的。https://firebase.google.com/docs/functions/callable
OkHttp调用https函数的代码在这里。https://github.com/ryuta46/firebase-callable-okhttp/blob/56adc5e29a35bdb3b355c14d734e6145da4b6809/android/app/src/main/java/com/ttechsoft/okhttp_callable/MainActivity.kt#L184-L239
已编辑。
主要部分的代码如下。
private fun callWithOkHttp(functionName: String)
val idToken = idToken ?: return
val instanceId = instanceId ?: return
val projectId = FirebaseApp.getInstance()?.options?.projectId ?: return
val url = "https://us-central1-$projectId.cloudfunctions.net/$functionName"
val jsonData = JSONObject()
jsonData.put("text", "inputText")
val json = JSONObject()
json.put("data", jsonData)
val requestBody = RequestBody.create(JSON, json.toString())
val request = Request.Builder()
.url(url)
.post(requestBody)
.addHeader("Authorization", "Bearer $idToken")
.addHeader("Firebase-Instance-ID-Token", instanceId)
.build()
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(1 , TimeUnit.MINUTES)
.readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES)
.build()
Log.i(TAG, "Start Okhttp")
okHttpClient.newCall(request).enqueue(object : Callback
override fun onResponse(call: Call, response: Response)
if (!response.isSuccessful)
val message = response.body()?.string() ?: "Network Error"
runOnUiThread
textOkHttpResult.text = message
return
runOnUiThread
textOkHttpResult.text = "OK"
val responseBody = response.body()
Log.i(TAG, responseBody?.string())
override fun onFailure(call: Call, e: IOException)
val message = e.message ?: "Unknown Network error"
runOnUiThread
textOkHttpResult.text = message
)
【讨论】:
以上是关于Firebase 云函数更改超时的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 云函数对另一个 Firebase 云函数的 http 请求