232 votes

Utiliser le constructeur d'URI dans Android ou créer une URL avec des variables

Je suis en train de développer une application Android. J'ai besoin de construire un URI pour que mon application puisse faire une demande d'API. À moins qu'il n'existe un autre moyen de placer une variable dans un URI, c'est la méthode la plus simple que j'ai trouvée. J'ai découvert que vous devez utiliser Uri.Builder mais je ne sais pas trop comment faire. 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 le(s) segment(s) du chemin est (sont) ttarrivals.aspx et la chaîne de requête est key=[redacted]&mapid=value .

Mon code est le suivant :

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 l'intégrer dans le Uri.Builder ? Dois-je tout ajouter comme URI.add(scheme) , URI.add(authority) et ainsi de suite ? Ou est-ce que ce n'est pas la bonne façon de procéder ? Par ailleurs, existe-t-il un autre moyen plus simple d'ajouter une variable à un URI/URL ?

471voto

David Points 846

Disons que je veux créer l'URL suivante :

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

Pour le construire 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();

1 votes

Avec mon segment de chemin, s'agirait-il d'un chemin ? Ou serait-ce une requête ?

0 votes

Si c'est un chemin, alors ce serait appendPath() pour la méthode. S'il s'agit d'une chaîne de requête (venant après le ?), utilisez alors appendQueryParameter() . Regardez l'URL que j'ai dans l'exemple et ce que je fais avec chaque segment. J'ai également ajouté toString() à la build() appeler pour récupérer le bon type.

1 votes

C'est avant le point d'interrogation, mais il n'y a pas de / après. C'est ttarrivals.aspx sur ma question ci-dessus. Donc ce serait un chemin ?

332voto

Amit Tripathi Points 3521

Il existe 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 décrite ci-dessus ou même à l'intérieur de la balise 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();

Enfin

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

23 votes

Vous méritez plus de votes ! Pour moi, le cas d'utilisation de base est lorsque vous avez une URL de chaîne déjà définie, et que vous voulez ajouter/appliquer des paramètres !

1 votes

Je cherchais une solution pour le soleil (cette chaîne exacte) mais la question la plus votée fournit une solution beaucoup plus robuste.

3 votes

Merci pour l'astuce Uri.buildUpon() ! Cela m'a évité quelques maux de tête.

23voto

Chris Points 337

L'excellente réponse ci-dessus s'est transformée en une simple méthode utilitaire.

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

0 votes

Pas besoin de convertir le contenu UTF8 ?

21voto

Mina Shaker Points 333

Voici une bonne façon de l'expliquer :

il existe deux formes d'URI

1 - Bâtisseur (prêt à être modifié , pas prêt à l'être utilisé )

2 - Construit( pas prêt à l'être modifié prête à être utilisé )

Vous pouvez créer un constructeur en

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

cela va retourner un Constructeur 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, il faut d'abord le construire.

retrun builder.build();

ou n'importe comment vous allez l'utiliser. et ensuite vous avez construit qui est déjà construit pour vous, prêt à être utilisé mais qui ne peut pas être modifié.

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

Il est prêt à l'emploi mais si vous voulez 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 voulez le modifier, vous devez buildUpon() et à la fin construire() .

donc Uri.Builder est un Constructeur qui stocke un Builder en son sein. Uri est un Construit qui stocke un URI déjà construit.

nouveau Uri.Builder() ; rerourne un Constructeur . Uri.parse("votre URI va ici") renvoie un Construit .

et avec construire() vous pouvez le changer de Constructeur a Construit . buildUpon() vous pouvez le changer de Construit a 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 vous a aidé :) <3

8voto

Basheer AL-MOMANI Points 5565

Pour l'exemple dans le 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, vous l'obtenez comme URL comme ceci

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

et ouvrir une connexion

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

et si le lien est simple comme l'uri de l'emplacement, par exemple

geo:0,0?q=29203

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

2 votes

URL url = new URL(builder.build().toString()); doit être entouré d'un bloc try catch pour l'exception MalformedURLException.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X