如何使用HTTP请求将嵌套数据发布到Firebase Firestore?

时间:2020-07-02 01:33:23

标签: firebase google-cloud-firestore godot gdscript

因此,我一直在为我正在进行的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”键有关,但是当值不是字符串值时,我似乎无法弄清楚该怎么办。有人知道如何解决这个问题吗?

1 个答案:

答案 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" }