如何使用 HTTP 请求 post 将数据嵌套到 firebase firestore?
How can I post nested data to the firebase firestore with HTTP requests?
所以我一直在为我正在处理的 Godot 项目的 REST API 后端使用 firebase firestore 功能。我正在使用 post 的 HTTP 请求并从数据库中获取数据。到目前为止,我只使用了简单类型的数据,将一个用户的 ID 与他或她的用户名相关联为一个字符串。
在我的代码中,我定义了一个函数,负责通过 HTTP 请求实际保存新文件:
func save_document(path: String, fields: Dictionary, http: HTTPRequest) -> void:
var document = { "fields": fields }
var body = to_json(document)
var url = FIRESTORE_URL + path
var res = http.request(url, _get_request_headers(), false, HTTPClient.METHOD_POST, body)
if res == OK:
print("successfully created document")
else:
print("failed creating document")
然后我调用函数:
var payload_body_1 = {
"name": {
"stringValue": username.text
}
}
save_document("users?documentId=%s" % firebase.user_info.id, payload_body_1, http)
以上所有工作 100% 正常。但是当我尝试 post 更复杂的数据时,比如字典的字典的字典,我 运行 陷入了一些问题。
当我运行以下代码时:
var res = {
"north": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
"south": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
"east": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
"west": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
}
save_document("online?documentId=test", res, http)
没用。我想它与我在它起作用的情况下使用的“stringValue”键有关,但我似乎无法弄清楚当该值不是字符串值时该怎么做。有谁知道如何解决这个问题?
好的,所以我实际上解决了它,但我想如果其他人将来可能遇到同样的问题,我也可以 post 在这里回答。
基本上,每个字段都需要一种数据类型,例如“stringValue”。对于字典,您需要“mapValue”,而对于列表,您需要“arrayValue”。在上面的示例中,您需要使用如下代码:
var res = {
"north": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } },
"south": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } },
"east": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } },
"west": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } }
}
mapValues 需要“fields”键,它是与“mapValue”关联的字典中键的字典。 arrayValues 需要类似的东西,但“值”而不是“字段”。 values 中数组的每个元素都应该是一个字典,如果您希望数组包含字符串,则每个元素应该如下所示:
{ "stringValue": "text" }
所以我一直在为我正在处理的 Godot 项目的 REST API 后端使用 firebase firestore 功能。我正在使用 post 的 HTTP 请求并从数据库中获取数据。到目前为止,我只使用了简单类型的数据,将一个用户的 ID 与他或她的用户名相关联为一个字符串。
在我的代码中,我定义了一个函数,负责通过 HTTP 请求实际保存新文件:
func save_document(path: String, fields: Dictionary, http: HTTPRequest) -> void:
var document = { "fields": fields }
var body = to_json(document)
var url = FIRESTORE_URL + path
var res = http.request(url, _get_request_headers(), false, HTTPClient.METHOD_POST, body)
if res == OK:
print("successfully created document")
else:
print("failed creating document")
然后我调用函数:
var payload_body_1 = {
"name": {
"stringValue": username.text
}
}
save_document("users?documentId=%s" % firebase.user_info.id, payload_body_1, http)
以上所有工作 100% 正常。但是当我尝试 post 更复杂的数据时,比如字典的字典的字典,我 运行 陷入了一些问题。
当我运行以下代码时:
var res = {
"north": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
"south": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
"east": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
"west": {"spades": [], "hearts": [], "diamonds": [], "clubs": []},
}
save_document("online?documentId=test", res, http)
没用。我想它与我在它起作用的情况下使用的“stringValue”键有关,但我似乎无法弄清楚当该值不是字符串值时该怎么做。有谁知道如何解决这个问题?
好的,所以我实际上解决了它,但我想如果其他人将来可能遇到同样的问题,我也可以 post 在这里回答。
基本上,每个字段都需要一种数据类型,例如“stringValue”。对于字典,您需要“mapValue”,而对于列表,您需要“arrayValue”。在上面的示例中,您需要使用如下代码:
var res = {
"north": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } },
"south": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } },
"east": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } },
"west": { "mapValue": { "fields": {
"spades": { "arrayValue": { "values": [] } },
"hearts": { "arrayValue": { "values": [] } },
"diamonds": { "arrayValue": { "values": [] } },
"clubs": { "arrayValue": { "values": [] } }
} } }
}
mapValues 需要“fields”键,它是与“mapValue”关联的字典中键的字典。 arrayValues 需要类似的东西,但“值”而不是“字段”。 values 中数组的每个元素都应该是一个字典,如果您希望数组包含字符串,则每个元素应该如下所示:
{ "stringValue": "text" }