我使用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中开发的应用程序中没有。
答案 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);
}
}
另见api.dartlang.org/stable/1.24.3/dart-core/Uri/...
答案 1 :(得分:0)
你可以使用这个flutter包,它允许你从flutter应用程序与你的feathers js服务器通信,如:https://stackoverflow.com/a/65538226/12461921