如何使用 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" }