it-swarm.com.de

Verwenden Sie den URI-Builder in Android) oder erstellen Sie eine URL mit Variablen

Ich entwickle eine Android App. Ich muss einen URI für meine App erstellen, um eine API-Anfrage zu stellen. Sofern es keine andere Möglichkeit gibt, eine Variable in einen URI einzufügen, ist dies die einfachste Möglichkeit, die ich verwende Ich habe festgestellt, dass Sie Uri.Builder verwenden müssen, bin mir aber nicht sicher, wie.

http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value 

Mein Schema ist http, die Berechtigung ist lapi.transitchicago.com, Der Pfad ist /api/1.0, Die Pfadsegmente sind ttarrivals.aspx Und die Abfragezeichenfolge ist key=[redacted]&mapid=value.

Mein Code ist unten:

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

Ich verstehe, dass ich URI.add Ausführen kann, aber wie kann ich es in Uri.Builder Integrieren? Soll ich alles wie URI.add(scheme), URI.add(authority) usw. hinzufügen? Oder ist das nicht der richtige Weg? Gibt es auch eine andere einfachere Möglichkeit, einer URI/URL eine Variable hinzuzufügen?

186
hichris123

Angenommen, ich möchte die folgende URL erstellen:

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

Um dies mit dem Uri.Builder Ich würde folgendes tun.

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

Es gibt eine andere Möglichkeit, Uri zu verwenden, und wir können dasselbe Ziel erreichen

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

Um den Uri zu bauen, kannst du diesen benutzen

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

Sie können dies alles auf die obige Weise oder sogar innerhalb der Uri.parse() und appendQueryParameter() deklarieren.

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

Zu guter Letzt

URL url = new URL(builtUri.toString());
228
Amit Tripathi

Ausgezeichnete Antwort von oben verwandelte sich in eine einfache Utility-Methode.

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

hier ist ein guter Weg, um es zu erklären:

es gibt zwei Formen der URI

1 - Builder (bereit zu sein geändert, nicht bereit zu sein verwendet)

2 - Gebaut (nicht bereit zu sein geändert, bereit zu sein verwendet)

Sie können einen Builder erstellen, indem Sie

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

dies wird ein Builder zurückgeben, das wie folgt geändert werden kann: -

builder.scheme("https");
builder.authority("api.github.com");
builder.appendPath("search");
builder.appendPath("repositories");
builder.appendQueryParameter(PARAMETER_QUERY,parameterValue);

aber um es zu benutzen, muss man es zuerst bauen

retrun builder.build();

oder wie auch immer du es benutzen wirst. und dann haben Sie built, das bereits für Sie erstellt wurde, einsatzbereit ist, aber nicht geändert werden kann.

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

dies ist einsatzbereit, aber wenn Sie es ändern möchten, müssen Sie 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

jetzt müssen Sie jedes Mal, wenn Sie es ändern möchten, buildUpon () und am Ende build ().

also ri.Builder ist ein Builder Typ, der einen Builder darin speichert. ri ist ein Built Typ, der einen bereits erstellten URI speichert

new Uri.Builder (); Gibt einen Builder zurück. ri.parse ("Ihre URI geht hier") gibt ein Built zurück

und mit build () können Sie es von Builder zu Built ändern. buildUpon () Sie können es von Built in Builder ändern. Hier ist, was Sie tun können

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

und auch das Gegenteil: -

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

hoffe meine antwort hat geholfen :) <3

12
Mina Shaker

für das Beispiel im secondAnswer habe ich diese Technik für dieselbe URL verwendet

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

dann, nachdem es fertig gebaut wurde, wird es als URL wie folgt angezeigt

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

und eine Verbindung öffnen

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

und wenn der Link simple ist, wie zum Beispiel der Ort uri

geo:0,0?q=29203

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

Wenn Sie appendEncodePath() verwenden, können Sie mehrere Zeilen als appendPath() speichern. Der folgende Codeausschnitt erstellt diese 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

Sie können dies mit Lambda-Ausdrücken tun.

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

und Sie können solche Parameter erstellen;

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

Btw. Wenn Sie vor einem Problem wie “lambda expressions not supported at this language level”, bitte überprüfen Sie diese URL;

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

0
yusuf