Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Url Dart:将地图转换为查询字符串_Url_Map_Type Conversion_Query String_Dart - Fatal编程技术网

Url Dart:将地图转换为查询字符串

Url Dart:将地图转换为查询字符串,url,map,type-conversion,query-string,dart,Url,Map,Type Conversion,Query String,Dart,我需要将映射转换为查询字符串(在第一个?之后)。例如,如果我有以下地图: Map-json={ “电子邮件”:eml, “密码”:passwd }; 和一个基本URL: String baseURL=”http://localhost:8080/myapp"; 然后我需要将jsonMap转换为基本URL的查询字符串: String fullURL=parameterEURL(baseURL,json); //印刷品:http://localhost:8080/myapp?email=blah

我需要将
映射
转换为查询字符串(在第一个
之后)。例如,如果我有以下地图:

Map-json={
“电子邮件”:eml,
“密码”:passwd
};
和一个基本URL:

String baseURL=”http://localhost:8080/myapp";
然后我需要将json
Map
转换为基本URL的查询字符串:

String fullURL=parameterEURL(baseURL,json);
//印刷品:http://localhost:8080/myapp?email=blah&password=meh
//(如果输入“blah”作为电子邮件,输入“meh”作为密码)
打印(完整URL);
我在Git上找到了,但是我需要这个的!这将是伟大的,在那里得到网址编码以及


我很高兴能自制一些东西,但由于对Dart来说太陌生了,我想知道
pub
/Github/ethersphere上是否有什么东西已经做到了这一点。

你能描述一下你的用法吗?首先,在GET请求中保留诸如密码之类的数据不是一个好的做法。这是一个更好的方式,作为一个POST请求。也就是说,如果您确实希望将其用作POST请求以将地图发送到服务器,请查看:它将自动将您提供的地图作为POST数据添加到服务器。需要记住的一点是,数据必须是映射(或者键和值必须是字符串)。用法示例:

导入'dart:html';
// ...
//在登录相关方法中的某个地方
postFormData('login.php',data.),然后((HttpRequest-req){
如果(请求状态!=200){
打印(请求状态文本);
}
});
服务器端Dart有一个可用的软件包,它允许您轻松地编写手工处理各种HTTP请求的程序,并恰当地命名为。但是,这不适用于客户端脚本。我不知道有任何现有的软件包可以提供您想要的功能


在这一点上,如果您确实决定推出您自己的,也许可以向您在问题中提到的QueryString项目提供一个pull请求,以便其他人可以在一个简单的包中使用该功能。

您看过dart:core中的Uri类了吗。您可以从Url组件构造Uri类:

新Uri({String scheme,String userInfo:,String host:,端口:0,字符串路径,
Iterable路径段、字符串查询、,
映射查询参数,片段:“}”)#
请注意,如果您使用的HTTP客户端不接受此类,则可以将查询字符串作为映射传递。t将其字符串化以获取Url

我在代码中使用它,而不是字符串Url

以使用上述数据为例:

void main(){
字符串eml=”me@here.com";
字符串passwd=“password”;
映射json={
“电子邮件”:eml,
“密码”:passwd
};  
Uri outgoingUri=新Uri(方案:“http”,
主机:“localhost”,
端口:8080,
路径:“myapp”,
查询参数:json);
印刷品(支出);;
}
这张照片是:

http://localhost:8080/myapp?email=me%40here.com&password=password

请注意,一旦构建了Uri,它是不可变的,即不能再次更改查询参数。pub中还有一个包,虽然我还没有使用它,但它可以提供更多的功能。

我编写了一个递归函数,可以将任何
映射
转换为查询
字符串

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);
TL;博士

String queryString=Uri(queryParameters:{'x':'1','y':'2'});
打印(查询字符串);//x=1&y=2

以防万一,如果您使用Dio库,您可能会使用Transformer.urlEncodeMap。它接受地图

String Transformer.urlEncodeMap(映射)

您可以在这里的官方文档中找到它:

谢谢@Matt B(+1)-我想电子邮件/密码是一个糟糕的用例。假设我想构造一个URL,用于在GET端点上访问第三方RESTful API,比如:
(GET)http://api.somevendor.example.com/widgets?fragile=true&size=4&color=red
。在这种情况下,我想要转换
映射参数={“易碎”:true,“大小”:4,“颜色”:“红色”}编码到URL中。再一次,我很高兴自己做这件事,但在我发挥精神力量之前,我想知道Dart是否有什么已经做到了这一点-没有必要重新发明轮子。更新了我对服务器端的回应。但最终不,我不知道有一个现有的包在客户端提供该功能。这不是问题的答案,即使这是一个合法的答案。谢谢@user2685314(+1)-你能给我一个实际的代码示例吗,也许可以使用上面我的电子邮件/密码示例?再次感谢!!!为什么这不是公认的答案?您还可以使用
Uri
构造函数和
queryParameters
参数将
Map
转换为查询字符串,这非常方便。这应该是公认的答案吗?我使用了您将作为查询参数发送的最合理的类型;虽然此代码可以回答问题,但提供有关此代码回答问题的原因和/或方式的附加上下文可提高其长期价值。
queryParameters
只能是
Map
Map
。不幸的是,它不够智能,无法自动
.toString()
映射类型的值。下面的逻辑转换我的动态映射供我使用:
Uri(queryParameters:json.map((key,value)=>MapEntry(key,value==null?null:value.toString()))。query
简短且信息丰富
&aa=1.1&bb[0]=2&bb[1][0]=3&bb[1][1][0]=5&bb[1][1][1][66]=777
String Transformer.urlEncodeMap(Map<String, dynamic>)