Utilisez URI builder dans Android ou créez une URL avec des variables
Je développe une application Android. J'ai besoin de construire un URI pour mon application pour faire une demande D'API. À moins qu'il n'y ait un autre moyen de mettre une variable dans un URI, c'est le moyen le plus simple que j'ai trouvé. J'ai trouvé que vous devez utiliser Uri.Builder
, mais je ne suis pas tout à fait sûr de savoir comment. Mon url est:
http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value
Mon schéma est http, l'autorité est lapi.transitchicago.com
, le chemin est /api/1.0
, segment de chemin(s) est ttarrivals.aspx
, et la chaîne de requête est key=[redacted]&mapid=value
.
Mon code est ci-dessous:
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);
Je comprends que je peux faire URI.add
, mais comment puis-je intégrez - le dans le Uri.Builder
? Devrais-je ajouter tout comme URI.add(scheme)
, URI.add(authority)
et ainsi de suite? Ou n'est-ce pas le moyen de le faire? En outre, Existe-t-il un autre moyen plus facile d'ajouter une variable à un URI/URL?
6 réponses
Disons que je veux créer L'URL suivante:
https://www.myawesomesite.com/turtles/types?type=1&sort=relevance#section-name
Pour construire ceci avec le Uri.Builder
je ferais ce qui suit.
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();
Il y a une autre façon d'utiliser Uri
et nous pouvons atteindre le même objectif
http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7
Pour construire L'Uri, vous pouvez utiliser ceci
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";
Vous pouvez déclarer tout cela de la manière ci-dessus ou même à l'intérieur du Uri.parse()
et 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();
Enfin
URL url = new URL(builtUri.toString());
Excellente réponse d'en haut transformé en une méthode utilitaire simple.
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();
}
Voici une bonne façon de l'expliquer:
Il existe deux formes de L'URI
1 - Builder(prêt à être modifié, pas, prêts à être utilisé)
2 - Intégré(pas, prêts à être modifiée, prêt à être utilisé )
Vous pouvez créer un générateur par
Uri.Builder builder = new Uri.Builder();
Cela va retourner un Builder prêt à être modifié comme ceci: -
builder.scheme("https");
builder.authority("api.github.com");
builder.appendPath("search");
builder.appendPath("repositories");
builder.appendQueryParameter(PARAMETER_QUERY,parameterValue);
Mais pour l'utiliser, vous devez d'abord le construire
retrun builder.build();
Ou cependant, vous allez l'utiliser. et puis vous avez construit qui est déjà construit pour vous, prêt à l'emploi mais ne peut pas être modifié.
Uri built = Uri.parse("your URI goes here");
C'est prêt à utiliser, mais si vous souhaitez le modifier, vous devez 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
Maintenant, chaque fois que vous souhaitez le modifier, vous devez buildUpon() et en fin de compte build().
Donc Uri.Builder {[13] } est un type Builder qui y stocke un Builder. Uri est un Construit tapez qui stockent un URI déjà construit
Nouvel Uri.Builder (); retourne un Builder . Uri.parse("votre URI va ici") retourne un Construit
Et avec build(), vous pouvez le modifier à partir de Constructeur à Construit. buildUpon() vous cam de le modifier à partir de Construit à Constructeur voici ce que vous pouvez faire
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
Et aussi le contraire:-
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();
J'espère que ma réponse a aidé :)
Dans l'exemple second
Answer
j'ai utilisé cette technique pour la même 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);
Puis après avoir fini de le construire, obtenez-le comme URL
comme ceci
URL url = new URL(builder.build().toString());
Et ouvrez une connexion
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
Et si link est simple
comme l'uri d'emplacement, par exemple
geo:0,0?q=29203
Uri geoLocation = Uri.parse("geo:0,0?").buildUpon()
.appendQueryParameter("q",29203).build();
Utiliser appendEncodePath()
, vous pourriez économiser plusieurs lignes de appendPath()
, l'extrait de code suivant s'accumule cette 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());