http url参数无效字符错误

时间:2017-12-16 04:33:43

标签: dart flutter feathersjs

我使用feathers.js(https://feathersjs.com/)开发了一个REST API 尝试使用软件包在Flutter中执行HTTP“读取”请求时:http / http.dart我遇到了错误。 http.dart库无法正确解析我传递给URI的查询参数。

我通过Android Studio调试控制台收到的错误是;

FormatException:无效字符(在字符84处)E / flutter (11338):... lk.com/weatherobs?last=true&location[$in]=Bellambi&location[$in]=Nowra ....

错误表示方括号,可能是$ sign('[$ in]')是问题。

_getDemoRequest() {
  String url = r"http://demoapi.ap-southeast-2.elasticbeanstalk.com/weatherobs?last=true&location[$in]=Bellambi&location[$in]=Nowra&location[$in]=Sydney Airport&location[$in]=Thredbo Top Station&location[$in]=Hobart&location[$in]=Coolangatta";
  http.read(url).then(print);    
}

在URL中我尝试使用带有和没有'r'的字符串为原始字符串添加前缀无效。

我也试过使用带有参数的httpClient但没有成功,方括号上的错误完全相同,例如'[$ in]'

  String httpbaseUri = "http://xxxx.ap-southeast-2.elasticbeanstalk.com";
  String qParams = r"?last=true&location[$in]=Bellambi&location[$in]=Nowra";
  String path = "/weatherobs";
  var _uri = new Uri.http(baseUri, path, qParams);
  await httpClient.read(_uri, headers: {"Accept": "application/json"});

作为一个有大约3周Flutter / Dart经验的人,我认为这是一个基本问题,但其中几个小时的研究没有找到解决方案。

URI查询参数的结构方式(方括号,即[$ in])由feathers.js框架决定。

任何帮助都将不胜感激。

在另一个帖子https://stackoverflow.com/questions/40568/are-square-brackets-permitted-in-urls中引起了我的注意:

URL规范RFC 3986通常不允许URL中的方括号。

我的问题是由于get请求在Postman,Chrome浏览器以及使用axios.js的javascript应用程序中正常工作而触发,但在使用标准http.read方法在Flutter / Dart中开发的应用程序中没有。

2 个答案:

答案 0 :(得分:3)

URL中不支持[](IPv6的主机IP除外)。请参阅Are square brackets permitted in URLs?

请检查API是否在编码时接受它们:

void main() {
    var url = r'http://demoapi.ap-southeast-2.elasticbeanstalk.com/weatherobs';
    var locationKey = Uri.encodeQueryComponent(r'location[$in]');
    var qParams = 'last=true&$locationKey=Bellambi&$locationKey=Nowra&$locationKey=Sydney Airport&$locationKey=Thredbo Top Station&$locationKey=Hobart&$locationKey=Coolangatta'; 

    try {
      print(Uri.parse(url).replace(query: qParams));
    } catch(e) {
      print(e);
    }
}

DartPad example

另见api.dartlang.org/stable/1.24.3/dart-core/Uri/...

答案 1 :(得分:0)

你可以使用这个flutter包,它允许你从flutter应用程序与你的feathers js服务器通信,如:https://stackoverflow.com/a/65538226/12461921