Browse Source

Enhance HTTPClient.query_string_from_dict()

Pedro J. Estébanez 7 years ago
parent
commit
8d8e9d54c8
2 changed files with 27 additions and 1 deletions
  1. 21 1
      core/io/http_client.cpp
  2. 6 0
      doc/classes/HTTPClient.xml

+ 21 - 1
core/io/http_client.cpp

@@ -618,7 +618,27 @@ String HTTPClient::query_string_from_dict(const Dictionary &p_dict) {
 	String query = "";
 	Array keys = p_dict.keys();
 	for (int i = 0; i < keys.size(); ++i) {
-		query += "&" + String(keys[i]).percent_encode() + "=" + String(p_dict[keys[i]]).percent_encode();
+		String encoded_key = String(keys[i]).percent_encode();
+		Variant value = p_dict[keys[i]];
+		switch (value.get_type()) {
+			case Variant::ARRAY: {
+				// Repeat the key with every values
+				Array values = value;
+				for (int j = 0; j < values.size(); ++j) {
+					query += "&" + encoded_key + "=" + String(values[j]).percent_encode();
+				}
+				break;
+			}
+			case Variant::NIL: {
+				// Add the key with no value
+				query += "&" + encoded_key;
+				break;
+			}
+			default: {
+				// Add the key-value pair
+				query += "&" + encoded_key + "=" + String(value).percent_encode();
+			}
+		}
 	}
 	query.erase(0, 1);
 	return query;

+ 6 - 0
doc/classes/HTTPClient.xml

@@ -111,6 +111,12 @@
 				String queryString = httpClient.query_string_from_dict(fields)
 				returns:= "username=user&amp;password=pass"
 				[/codeblock]
+				Furthermore, if a key has a null value, only the key itself is added, without equal sign and value. If the value is an array, for each value in it a pair with the same key is added.
+				[codeblock]
+				var fields = {"single": 123, "not_valued": null, "multiple": [22, 33, 44]}
+				String queryString = httpClient.query_string_from_dict(fields)
+				returns:= "single=123&amp;not_valued&amp;multiple=22&amp;multiple=33&amp;multiple=44"
+				[/codeblock]
 			</description>
 		</method>
 		<method name="read_response_body_chunk">