我有一种情况需要将Map
变成查询字符串(在第一个?
之后)。例如,如果我有以下地图:
Map json = {
"email": eml,
"password": passwd
};
基础网址:
String baseURL = "http://localhost:8080/myapp";
然后我需要将json Map
转换为基本URL的查询字符串的东西:
String fullURL = parameterizeURL(baseURL, json);
// Prints: http://localhost:8080/myapp?email=blah&password=meh
// (if "blah" was entered as the email, and "meh" was entered as the password)
print(fullURL);
我在Git上找到this query String-to-map library,但我需要反向!在那里获取URL编码也很棒。
我很高兴能够制作本土的东西,但对Dart这么新,我想知道pub
/ Github / etherspehere上是否有任何东西可以做到这一点。
答案 0 :(得分:14)
你看过dart中的Uri课:核心。您可以从Url组件构建Uri类:
new Uri({String scheme, String userInfo: "", String host: "", port: 0, String path,
Iterable<String> pathSegments, String query,
Map<String, String> queryParameters, fragment: ""}) #
请注意,您将查询字符串作为映射传递,如果您使用的是不接受此类的HTTP客户端,则可以将其绑定以获取Url。
我在我的代码中使用它而不是字符串Url的
使用上述数据作为示例:
void main() {
String eml = "me@here.com";
String passwd = "password";
Map json = {
"email": eml,
"password": passwd
};
Uri outgoingUri = new Uri(scheme: 'http',
host: 'localhost',
port: 8080,
path: 'myapp',
queryParameters:json);
print(outgoingUri);
}
打印:
http://localhost:8080/myapp?email=me%40here.com&password=password
注意,一旦构造了Uri是不可变的,即你不能再次更改查询参数。在pub中还有this包可以提供更多设施,尽管我还没有使用它。
答案 1 :(得分:6)
TL; DR
String queryString = Uri(queryParameters: {'x': '1', 'y': '2'}).query;
print(queryString); // x=1&y=2
答案 2 :(得分:1)
你能描述一下你的用法吗?首先,在GET请求中保留密码等数据并不是一种好习惯。这可以更好地成为POST请求。也就是说,如果您确实希望将其用作POST请求以将服务器发送到地图,请查看:HttpRequest.postFormData它会自动将您提供的Map作为POST数据添加到服务器。需要记住的一点是,数据必须是Map(或键和值必须是字符串)。用法示例:
import 'dart:html';
// ...
// Somewhere in your login related method
HttpRequest.postFormData('login.php', data).then((HttpRequest req) {
if(req.status != 200) {
print(req.statusText);
}
});
有一个可用于服务器端Dart的软件包,它允许您轻松地处理各种HTTP请求,简称为http。但是,这不适用于客户端脚本。我不知道任何现有的软件包可以提供您正在寻找的功能。
在这方面,如果您决定自己推送,可能会向您在问题中提到的QueryString项目提供拉取请求,以便其他人可以在一个简单的包中使用该功能。
答案 3 :(得分:0)
我写了一个递归函数来将任何Map<String, dynamic>
转换为查询String
。
String getQueryString(Map params, {String prefix: '&', bool inRecursion: false}) {
String query = '';
params.forEach((key, value) {
if (inRecursion) {
key = '[$key]';
}
if (value is String || value is int || value is double || value is bool) {
query += '$prefix$key=$value';
} else if (value is List || value is Map) {
if (value is List) value = value.asMap();
value.forEach((k, v) {
query += getQueryString({k: v}, prefix: '$prefix$key', inRecursion: true);
});
}
});
return query;
}
示例:
Map<String, dynamic> params = {'aa': 1.1, 'bb': [2, [3, ['5', {'66': 777}]]]};
String query = getQueryString(params);
print(query);
此代码将打印:
&aa=1.1&bb[0]=2&bb[1][0]=3&bb[1][1][0]=5&bb[1][1][1][66]=777
答案 4 :(得分:0)
以防万一,如果您使用 Dio 库,您可以使用 Transformer.urlEncodeMap。它接受 Map
String Transformer.urlEncodeMap(Map<String, dynamic>)
您可以在此处的官方文档中找到它:https://pub.dev/documentation/dio/latest/dio/Transformer/urlEncodeMap.html