Intereting Posts
Запросить IntentService для получения информации о своей очереди Первый запуск Android Studio. Не удалось получить доступ к списку дополнений Android SDK Android – проблемы с элементами меню с возможностью проверки Панель действий Android SearchView как автозаполнение? Уведомление о тревоге Firebase – как показать многострочное сообщение в уведомлении Динамическое обновление TabLayout без изменения выбранной вкладки Android eclipse DDMS – не удается получить доступ к данным / данным / на телефоне, чтобы вытащить файлы Нужно хранить данные LOTS на устройстве Android, думая о выходе OODB Эффективность findViewById Масштабирование ImageView до ширины устройства Попытка вручную подписать пакет android с помощью jarsigner.exe и установить с помощью adb.exe Gradle DSL Метод не найден: packagingOptions () Ошибка упаковки Kivy с библиотекой numpy для Android с использованием buildozer Переопределите модуль кинжала в Robolectric Tests Изображения в SimpleCursorAdapter

Используйте URI-конструктор в Android или создайте URL-адрес с переменными

Я разрабатываю приложение для Android. Мне нужно создать URI для моего приложения, чтобы выполнить запрос API. Если есть другой способ поместить переменную в URI, это самый простой способ, который я нашел. Я обнаружил, что вам нужно использовать Uri.Builder , но я не совсем уверен, как это сделать. Мой URL:

 http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value 

Моя схема – http, авторитет – lapi.transitchicago.com , путь – /api/1.0 , сегмент пути – ttarrivals.aspx , а строка запроса – key=[redacted]&mapid=value .

Мой код ниже:

 Intent intent = getIntent(); String value = intent.getExtras().getString("value"); Uri.Builder builder = new Uri.Builder(); builder.scheme("http") .authority("www.lapi.transitchicago.com") .appendPath("api") .appendPath("1.0") .appendPath("ttarrivals.aspx") .appendQueryParameter("key", "[redacted]") .appendQueryParameter("mapid", value); 

Я понимаю, что я могу сделать URI.add , но как мне интегрировать его в Uri.Builder ? Должен ли я добавить все, как URI.add(scheme) , URI.add(authority) и т. Д.? Или это не способ сделать это? Кроме того, есть ли другой простой способ добавить переменную в URI / URL?

Solutions Collecting From Web of "Используйте URI-конструктор в Android или создайте URL-адрес с переменными"

Предположим, что я хочу создать следующий URL-адрес:

 https://www.myawesomesite.com/turtles/types?type=1&sort=relevance#section-name 

Чтобы построить это с помощью Uri.Builder я бы сделал следующее.

 Uri.Builder builder = new Uri.Builder(); builder.scheme("https") .authority("www.myawesomesite.com") .appendPath("turtles") .appendPath("types") .appendQueryParameter("type", "1") .appendQueryParameter("sort", "relevance") .fragment("section-name"); String myUrl = builder.build().toString(); 

Существует еще один способ использования Uri и мы можем достичь той же цели

 http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7 

Чтобы построить Uri, вы можете использовать это

 final String FORECAST_BASE_URL = "http://api.example.org/data/2.5/forecast/daily?"; final String QUERY_PARAM = "q"; final String FORMAT_PARAM = "mode"; final String UNITS_PARAM = "units"; final String DAYS_PARAM = "cnt"; 

Вы можете объявить все это выше или даже внутри Uri.parse() и appendQueryParameter()

 Uri builtUri = Uri.parse(FORECAST_BASE_URL) .buildUpon() .appendQueryParameter(QUERY_PARAM, params[0]) .appendQueryParameter(FORMAT_PARAM, "json") .appendQueryParameter(UNITS_PARAM, "metric") .appendQueryParameter(DAYS_PARAM, Integer.toString(7)) .build(); 

В конце концов

 URL url = new URL(builtUri.toString()); 
  • Источник: курс Udacity для Android / приложение Sunshine

Отличный ответ сверху превратился в простой метод утилиты.

 private Uri buildURI(String url, Map<String, String> params) { // build url with parameters. Uri.Builder builder = Uri.parse(url).buildUpon(); for (Map.Entry<String, String> entry : params.entrySet()) { builder.appendQueryParameter(entry.getKey(), entry.getValue()); } return builder.build(); } 

Для примера во second Answer я использовал этот метод для того же URL-адреса

http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7

 Uri.Builder builder = new Uri.Builder(); builder.scheme("https") .authority("api.openweathermap.org") .appendPath("data") .appendPath("2.5") .appendPath("forecast") .appendPath("daily") .appendQueryParameter("q", params[0]) .appendQueryParameter("mode", "json") .appendQueryParameter("units", "metric") .appendQueryParameter("cnt", "7") .appendQueryParameter("APPID", BuildConfig.OPEN_WEATHER_MAP_API_KEY); 

То после завершения строительства вы получите его как URL

 URL url = new URL(builder.build().toString()); 

И откройте соединение

  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

И если ссылка simple например, местоположение uri, например

geo:0,0?q=29203

 Uri geoLocation = Uri.parse("geo:0,0?").buildUpon() .appendQueryParameter("q",29203).build(); 

Использование appendEncodePath() может сэкономить вам несколько строк, чем appendPath() , следующий фрагмент кода создает этот URL-адрес: http://api.openweathermap.org/data/2.5/forecast/daily?zip=94043

 Uri.Builder urlBuilder = new Uri.Builder(); urlBuilder.scheme("http"); urlBuilder.authority("api.openweathermap.org"); urlBuilder.appendEncodedPath("data/2.5/forecast/daily"); urlBuilder.appendQueryParameter("zip", "94043,us"); URL url = new URL(urlBuilder.build().toString());