Преобразование строки в параметр запроса GET в Dart с использованием стандартной библиотеки

У меня есть строка из нескольких слов, которую я хотел бы преобразовать в параметр запроса GET.

У меня есть конечная точка API /search, которая принимает параметр query. Обычно ваш запрос будет выглядеть как http://host/search?query=Hello+World.

У меня есть String Hello World, который я хочу преобразовать в этот закодированный параметр URL.

Конечно, я мог бы просто написать логику, чтобы разбить ее на слова и добавить + между ними, но мне было интересно, будет ли В этом может помочь класс URI

Я использую Dart httpClient, чтобы сделать запрос.

Future<String> _getJsonData(String queryToSearch) async {
  List data = new List();
  var httpClient = new HttpClient();

  var request = await httpClient.getUrl(Uri.parse(
      config['API_ENDPOINT'] + '/search?query=' +
          queryToSearch));

  var response = await request.close();
  if (response.statusCode == HttpStatus.OK) {
    var jsonString = await response.transform(utf8.decoder).join();
    data = json.decode(jsonString);
    print(data[0]);
    return data[0].toString();
  } else {
    return "{}";
  }
}

По сути, необходимо закодировать queryToSearch в качестве параметра URL.


person bholagabbar    schedule 18.04.2018    source источник


Ответы (3)


Вы можете использовать Uri.http(s), который объединяет все (запрос, хост и путь) вместе и кодирует их соответствующим образом.

    final uri = new Uri.http(config['API_ENDPOINT'], '/search', {"query": queryToSearch});
person Rémi Rousselet    schedule 18.04.2018
comment
Как раз то, что мне было нужно. Я пытался Uri.ecode, но это для кодирования тела POST. Документация не была очень подробной о передаче подобных запросов в запросах GET. - person bholagabbar; 20.04.2018


Вы можете использовать Uri.parse(url_string), если у вас есть полный URL таким образом.

final String accountEndPoint = 'https://api.npoint.io/2e4ef87d9ewqf01e481e';

Future<Account> getAccountData() async {
    try {
      final uri = Uri.parse(accountEndPoint); // <===
      final response = await http.get(uri);
      if (response.statusCode == 200) {
        Map<String, dynamic> accountJson = jsonDecode(response.body);
        return Future.value(Account.fromJson(accountJson));
      } else {
        throw Exception('Failed to get account');
      }
    } catch (e) {
      return Future.error(e);
    }
  }

person Hesam    schedule 16.04.2021