Используйте URI builder в 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);
I понимаю, что я могу сделать URI.add
, но как мне интегрировать его в Uri.Builder
? Я должен добавить все, как URI.add(scheme)
,URI.add(authority)
и так далее? Или это не способ сделать это? Кроме того, есть ли другой более простой способ добавить переменную в URI/URL?
6 ответов:
допустим, что я хочу создать следующий 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 course / Sunshine app
отличный ответ сверху превратился в простой метод утилиты.
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(); }
вот хороший способ объяснить это:
есть две формы URI
1-Builder (готов быть изменен,не готов используется)
2 - постройки(не готов изменен готов быть используется)
вы можете создать конструктор с помощью
Uri.Builder builder = new Uri.Builder();
это вернет a Строитель готов к изменению, как это:-
builder.scheme("https"); builder.authority("api.github.com"); builder.appendPath("search"); builder.appendPath("repositories"); builder.appendQueryParameter(PARAMETER_QUERY,parameterValue);
но чтобы использовать его, вы должны построить его первый
retrun builder.build();
или как вы собираетесь его использовать. и тогда у вас есть построен который уже построен для вас, готов к использованию, но не может быть изменен.
Uri built = Uri.parse("your URI goes here");
это готово к использованию, но если вы хотите изменить его, вам нужно buildUpon()
Uri built = Uri.parse(Your URI goes here") .buildUpon(); //now it's ready to be modified .buildUpon() .appendQueryParameter(QUERY_PARAMATER, parameterValue) //any modification you want to make goes here .build(); // you have to build it back cause you are storing it // as Uri not Uri.builder
теперь каждый раз, когда вы хотите изменить его, вам нужно buildUpon() и в конце концов build ().
так Uri.Строитель это Строитель введите, что хранить Строитель в нем. Uri это построен введите, что хранить уже построенный URI в нем
новый Uri.Строитель(); rerurns a Строитель. Uri.разбор ("ваш URI идет сюда") возвращает a построен
и с build () вы можете изменить его от Строитель до построен. buildUpon() вы можете изменить его с построен до Строитель вот что вы можете сделать
Uri.Builder builder = Uri.parse("URL").buildUpon(); // here you created a builder, made an already built URI with Uri.parse // and then change it to builder with buildUpon(); Uri built = builder.build(); //when you want to change your URI, change Builder //when you want to use your URI, use Built
и наоборот:-
Uri built = new Uri.Builder().build(); // here you created a reference to a built URI // made a builder with new Uri.Builder() and then change it to a built with // built(); Uri.Builder builder = built.buildUpon();
надеюсь мой ответ помог :)
для примера в
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());