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?
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 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());
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();
}
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
pour l'exemple dans la 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 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();
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());
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;