web-dev-qa-db-fra.com

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

Je développe une application Android. Je dois créer un URI pour mon application afin de faire une demande d'API. Sauf s'il existe 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 deviez 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 d'accès est /api/1.0, le ou les segments de chemin d'accè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 l’intégrer dans le Uri.Builder? Dois-je tout ajouter comme URI.add(scheme), URI.add(authority) et ainsi de suite? Ou n'est-ce pas la façon de le faire? En outre, existe-t-il un moyen plus simple d’ajouter une variable à un URI/URL?

186
hichris123

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();
_
403
David

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 de la 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());
228
Amit Tripathi

Excellente réponse d'en haut transformée en une méthode d'utilité 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();
}
17
Chris

voici un bon moyen de l'expliquer:

il y a deux formes de l'URI

1 - Constructeur (prêt à être modifié, pas prêt à être tilisé)

2 - Construit (pas prêt à être modifié, prêt à être tilisé)

Vous pouvez créer un constructeur en

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

ça 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, vous devez d'abord le construire

retrun builder.build();

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

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

c'est prêt à utiliser 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 build ().

alors ri.Builder est un type Builder qui stocke un Builder. ri est un type Construit qui stocke un URI déjà construit dans celui-ci.

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

et avec build () vous pouvez le changer de Constructeur à Construit. buildUpon () vous pouvez le changer 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 l'inverse: -

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

espérons que ma réponse a aidé :) <3

12
Mina Shaker

pour l'exemple dans la secondAnswer 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 ouvrir une connexion

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

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

geo:0,0?q=29203

Uri geoLocation = Uri.parse("geo:0,0?").buildUpon()
            .appendQueryParameter("q",29203).build();
6
Basheer AL-MOMANI

L'utilisation de appendEncodePath() peut vous faire économiser plusieurs lignes de plus que appendPath(), le fragment de code suivant construit 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
Cody

Vous pouvez le faire avec des expressions lambda;

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

et vous pouvez créer des paramètres comme ça;

    Map<String, String> params = new HashMap<String, String>();
    params.put("Zip", "94043,us");
    params.put("units", "metric");

Btw. Si vous rencontrez un problème tel que “lambda expressions not supported at this language level”, veuillez vérifier cette URL;

https://stackoverflow.com/a/22704620/2057154

0
yusuf