parse objeto developer create appendqueryparameter android uri uribuilder

objeto - uri format android



Usa el creador de URI en Android o crea una URL con variables (6)

Digamos que quiero crear la siguiente URL:

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

Para construir esto con Uri.Builder , haría lo siguiente.

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();

Estoy desarrollando una aplicación para Android. Necesito construir un URI para que mi aplicación haga una solicitud de API. A menos que haya otra manera de poner una variable en un URI, esta es la forma más fácil que he encontrado. Descubrí que necesitas usar Uri.Builder , pero no estoy muy seguro de cómo hacerlo. Mi url es:

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

Mi esquema es http, la autoridad es lapi.transitchicago.com , la ruta es /api/1.0 , el segmento de ruta (s) es ttarrivals.aspx y la cadena de consulta es key=[redacted]&mapid=value .

Mi código está abajo:

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);

Entiendo que puedo hacer URI.add , pero ¿cómo lo integro en Uri.Builder ? ¿Debo agregar todo como URI.add(scheme) , URI.add(authority) etc.? ¿O no es esa la manera de hacerlo? Además, ¿hay alguna otra manera más fácil de agregar una variable a un URI / URL?


El uso de appendEncodePath() podría ahorrarle varias líneas además de appendPath() , el siguiente fragmento de código crea esta 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());


Excelente respuesta desde arriba convertida en un simple método de utilidad.

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(); }


Hay otra forma de usar Uri y podemos lograr el mismo objetivo

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

Para construir el Uri puedes usar esto

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";

Puede declarar todo esto de la manera anterior o incluso dentro de Uri.parse() y 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();

Al final

URL url = new URL(builtUri.toString());


aquí hay una buena manera de explicarlo:

hay dos formas de URI

1 - Constructor (listo para ser modificado , no listo para ser utilizado )

2 - Construido ( no listo para ser modificado , listo para usarse )

Puedes crear un constructor

Uri.Builder builder = new Uri.Builder();

esto va a devolver un generador listo para ser modificado así:

builder.scheme("https"); builder.authority("api.github.com"); builder.appendPath("search"); builder.appendPath("repositories"); builder.appendQueryParameter(PARAMETER_QUERY,parameterValue);

pero para usarlo tienes que construirlo primero

retrun builder.build();

o como quiera que lo vayas a usar y luego ha construido que ya está hecho para usted, listo para usar pero no puede ser modificado.

Uri built = Uri.parse("your URI goes here");

esto está listo para usar, pero si quieres modificarlo necesitas 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

ahora, cada vez que quiera modificarlo, necesita buildUpon () y al final build () .

entonces Uri.Builder es un tipo de Constructor que almacena un Constructor en él. Uri es un tipo Construido que almacena un URI ya construido en él

nuevo Uri.Builder (); vuelve a generar un generador. Uri.parse ("su URI va aquí") devuelve un Construido

y con build () puede cambiarlo de Builder a Built . buildUpon () puedes cambiarlo de Built to Builder aquí es lo que puedes hacer

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

y también lo opuesto:

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();

Espero que mi respuesta ayude :) <3


para el ejemplo en la second Answer , utilicé esta técnica para la misma 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);

luego, después de terminar de construirlo, obténgalo como una URL como esta

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

y abre una conexión

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

y si el enlace es simple como ubicación uri, por ejemplo

geo:0,0?q=29203

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