【问题标题】:Firebase: Is there a way to see the JSON payload being sent from the SDK?Firebase:有没有办法查看从 SDK 发送的 JSON 有效负载?
【发布时间】:2016-10-31 21:41:06
【问题描述】:

几个月来,我一直在使用 Firebase 开发 iOS 应用,但遇到了调用后端失败的问题。为了测试这个问题,我在 Firebase 上打开了模拟器并模拟了调用,它成功了,没有任何问题。所有其他调用都按预期工作。

我能得出的唯一结论是 JSON 有效负载在某种程度上与我的预期不同。

一些细节: 我所在的视图控制器正在对后端的数据结构进行持续观察(使用 observeEventOfType:withBlock:withCancelBlock:),并且该屏幕上的复选框操作相同数据结构的子值。因此,每次选中或取消选中一个框时,它都会使用新值调用 setValue:。然后,由于父数据结构正在被观察,它被更新,屏幕被刷新。

我遇到的问题是 setValue: 调用被拒绝,这反过来又击中了另一个方法的 cancelBlock。当我尝试在我的 Firebase 仪表板上模拟 setValue: 时,它成功了。

我在这里的 github gist 中添加了相关的后端规则和失败的方法: https://gist.github.com/jakehawken/4a4bb8d2f58c651d7310b3a1737bf11e

//RELEVANT BACKEND RULES FOR THE FAILING CALL (I'm writing to the "completed" path):
"subtasks": {
    "$list_item": {
        ".validate": "newData.hasChildren(['subtaskDescription', 'completed'])",
        "subtaskDescription" : {
            ".validate" : "newData.isString()"
        },
        "completed" : {
            ".validate" : "newData.isNumber() && !newData.hasChildren()"
        }
    }
}

方法调用失败(Objective-C):

- (KSPromise *)markSubtask:(HDInProgressSubtask *)subtask completed:(BOOL)completed forListID:(NSString *)listID inProgressItemKey:(NSString *)inProgressKey subtaskKey:(NSString *)subtaskKey
{
  KSDeferred *deferred = [KSDeferred defer];

  FIRDatabaseReference *specificSubtaskReference = [self specificSubtaskCompletionReferenceForListID:listID inProgressItemKey:inProgressKey subtaskKey:subtaskKey];

  FIRDatabaseReference *subtaskCompletionReference = [specificSubtaskReference child:kCompleted];

  NSNumber *value = [NSNumber numberWithBool:completed];

  [subtaskCompletionReference setValue:value withCompletionBlock:^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) {
    if (error)
    {
      [deferred rejectWithError:error]; //Failing case
    }
    else
    {
      [deferred resolveWithValue:@(completed)]; //Success case
    }
  }];

  return deferred.promise;
}

调用应该只是发送数字 1 或 0(包含在 NSNumber 中的 BOOL),但是当我打开详细日志记录时,它说它正在发送这个庞然大物:

{
  "d" :     {
        "a" : "p",
        "b" : {
            "d" : 1,
            "p" : "<the url path for this upload>"
        },
         "r" : 11
    },
    "t" : "d"
}

模拟器的明显成功:

【问题讨论】:

  • 我不是最擅长阅读obj-c; completed 的值是多少?那是直接将整数写入已完成的字段吗?我们确定这是设置吗?此外,允许写入此路径的 .write 规则在哪里?没有看到这里或要点。
  • 这是一个布尔值,所以即使它从未被分配,它也只会显示一个错误值。该文字语法只是将该布尔值包装在一个 NSNumber 中。写入规则在树中较高,但规则树较高的调用正在传递。

标签: ios objective-c firebase firebase-realtime-database firebase-security


【解决方案1】:

你可以得到最近的是enabling debug logging:

FIRDatabase.setLoggingEnabled(true)

【讨论】:

  • 是的,我做到了。然后将该日志复制到仪表板模拟器。模拟呼叫通过。 :-(
  • 为了帮助解决这个问题,我需要查看minimal code (+JSON +rules) that reproduces the problem。
  • 我现在在问题正文中包含了一个带有相关代码的 Github Gist。
【解决方案2】:

我终于自己弄明白了。

我注释掉了我的所有验证规则,以便我可以将任何我想要的内容发布到后端。到目前为止,我一直认为,由于我将布尔值包装在一个 NSNumber 中,我认为后端会将这个值存储为一个数字。因此,我对该路径的规则是 newValue.isNumber()。然而事实证明,Firebase 自动知道它是一个布尔值,所以当我删除所有规则时,发布到后端的值是“真”。所以,我将规则重写为 newValue.isBoolean() 现在它工作得很好。

故事的寓意:如果您使用布尔值初始化 NSNumber,那么当您将其交给 Firebase 时,创建的 JSON 有效负载将在意识到 NSNumber 是一个布尔值开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2012-07-24
    • 1970-01-01
    • 2011-02-15
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多