因此,我一直在为我正在进行的Godot项目的REST API后端使用firebase firestore功能。我正在使用HTTP请求来发布数据库并从数据库获取数据。到目前为止,我只使用了简单的数据类型,将一个用户的ID与其用户名(以字符串形式)相关联。
在我的代码中,我定义了一个函数,该函数负责通过HTTP请求实际保存新文件:
extension Collection {
subscript(safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
struct ContentView: View {
var names : [String] = ["1", "2" ,"3","4","5","6","7","8","9"]
var colors: [Color] = [.red, .gray, .green, .yellow, .blue].shuffled()
var body: some View {
HStack{
ForEach(Array(names.enumerated()), id: \.offset) { index, element in
Text(element)
.background(colors[safe: index] ?? colors[safe: index - colors.count])
}
}
}
}
然后我调用该函数:
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")
以上所有方法均可100%罚款。但是当我尝试发布更复杂的数据(例如字典词典字典)时,我遇到了一些问题。
当我运行以下代码时:
var payload_body_1 = {
"name": {
"stringValue": username.text
}
}
save_document("users?documentId=%s" % firebase.user_info.id, payload_body_1, http)
它不起作用。我想这与我在可行的情况下使用的“ stringValue”键有关,但是当值不是字符串值时,我似乎无法弄清楚该怎么办。有人知道如何解决这个问题吗?
答案 0 :(得分:1)
好的,所以我实际上解决了这个问题,但是我认为,如果将来其他人可能遇到相同的问题,我也可以在这里发布答案。
因此,基本上,每个字段都需要一种数据类型,例如“ 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”而不是“ fields”。值中数组的每个元素都应该是一个字典,例如,如果您希望数组包含字符串,则每个元素应类似于:
{ "stringValue": "text" }