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?

169
demandé sur AnV 2013-10-03 23:46:52

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();
363
répondu David 2014-10-17 13:07:48

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());
205
répondu Amit Tripathi 2016-12-30 10:58:09

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();
}
16
répondu Chris 2016-01-11 22:18:03

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é :)

9
répondu Mina Shaker 2017-11-11 21:31:48

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();
6
répondu Basheer AL-MOMANI 2016-02-20 17:37:36

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());
1
répondu Cody 2016-10-07 07:40:34