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 ?

4voto

Cody Points 2386

Utilisation de appendEncodePath() pourrait vous faire économiser plusieurs lignes que appendPath() le bout 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());

4voto

Blundell Points 28342

Meilleure réponse : https://stackoverflow.com/a/19168199/413127

Exemple pour

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

Maintenant avec Kotlin

 val myUrl = Uri.Builder().apply {
        scheme("https")
        authority("www.myawesomesite.com")
        appendPath("turtles")
        appendPath("types")
        appendQueryParameter("type", "1")
        appendQueryParameter("sort", "relevance")
        fragment("section-name")
        build()            
    }.toString()

1 votes

Merci d'avoir ajouté la version Kotlin :)

0voto

dustqm Points 416

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

Au fait. Si vous rencontrez un problème comme “lambda expressions not supported at this language level” veuillez consulter cette URL ;

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

0 votes

Et que faire après avoir défini les paramètres ?

0 votes

Params est le paramètre de la méthode 'getBaseUrl'. Pour appeler cette méthode, vous devez passer les paramètres.

0 votes

Merci ! Ce serait mieux si vous montriez une URL résultante (j'ai utilisé une autre solution).

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