Используйте 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?
Ответы
Ответ 1
Скажем, что я хочу создать следующий 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();
Ответ 2
Существует другой способ использования 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());
Ответ 3
Отличный ответ сверху превратился в простой метод утилиты.
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();
}
Ответ 4
вот хороший способ объяснить это:
существуют две формы URI
1 - Builder (готов к модификации , не готов к )
2 - Построен (не готов к изменен, готов к использованию )
Вы можете создать построитель
Uri.Builder builder = new Uri.Builder();
он вернет Builder, готовый к модификации следующим образом: -
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 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.Builder - это Builder, в котором хранится Builder.
Uri - это Встроенный тип, который хранит в нем уже построенный URI
новый Uri.Builder(); повторно запускает Builder.
Uri.parse( "ваш URI идет здесь" ) возвращает Встроенный
и wiht build() вы можете изменить его с Builder на Построено.
buildUpon(), вы можете изменить его с Встроенный на Builder
вот что вы можете сделать
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();
надеюсь, что мой ответ помог:) < 3
Ответ 5
для примера в 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();
Ответ 6
Использование 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());
Ответ 7
Вы можете сделать это с помощью лямбда-выражений;
private static final String BASE_URL = "http://api.example.org/data/2.5/forecast/daily";
private String getBaseUrl(Map<String, String> params) {
final Uri.Builder builder = Uri.parse(BASE_URL).buildUpon();
params.entrySet().forEach(entry -> builder.appendQueryParameter(entry.getKey(), entry.getValue()));
return builder.build().toString();
}
и вы можете создавать такие параметры;
Map<String, String> params = new HashMap<String, String>();
params.put("zip", "94043,us");
params.put("units", "metric");
Btw. Если у вас возникнут какие-либо проблемы, такие как "lambda expressions not supported at this language level"
, проверьте этот URL;
fooobar.com/info/58886/...