私はAndroidアプリを開発しています。私は自分のアプリがAPIリクエストをするためのURIを構築する必要があります。 URIに変数を入れる別の方法がない限り、これが私が見つけた最も簡単な方法です。私はあなたがUri.Builder
を使う必要があるとわかりました、しかし私はどうするべきかよくわかりません。私のURLは:
http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value
私のスキームはhttp、権限はlapi.transitchicago.com
、パスは/api/1.0
、パスセグメントはttarrivals.aspx
、そしてクエリ文字列はkey=[redacted]&mapid=value
です。
私のコードは以下の通りです。
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);
私はURI.add
を実行できることを理解していますが、どうやってそれをUri.Builder
に統合できますか? URI.add(scheme)
、URI.add(authority)
などのすべてを追加する必要がありますか?またはそれはそれを行う方法ではありませんか?また、URI/URLに変数を追加するためのもっと簡単な方法はありますか?
次のURLを作成したいとしましょう。
https://www.myawesomesite.com/turtles/types?type=1&sort=relevance#section-name
これを Uri.Builder
で構築するには、次のようにします。
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();
Uri
を使う別の方法があり、同じ目標を達成することができます
http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7
Uriを構築するためにあなたはこれを使うことができます
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";
これらすべてを上記の方法で宣言することも、Uri.parse()
と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();
やっと
URL url = new URL(builtUri.toString());
上記の優れた答えは簡単な効用方法に変わりました。
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();
}
これを説明するのに良い方法があります。
uRIには2つの形式があります
1 - ビルダー(変更する準備ができている、しない使用する準備ができている)
2 - ビルド済み( not 変更可能、使用可能)
あなたはビルダーを作成することができます
Uri.Builder builder = new Uri.Builder();
これは Builder を返して、このように変更する準備をします。 -
builder.scheme("https");
builder.authority("api.github.com");
builder.appendPath("search");
builder.appendPath("repositories");
builder.appendQueryParameter(PARAMETER_QUERY,parameterValue);
しかしそれを使うためには、最初にそれを構築する必要があります
retrun builder.build();
それともあなたはそれを使うつもりです。そして built がすでにあなたのためにビルドされていて、使用する準備はできていますが変更することはできません。
Uri built = Uri.parse("your URI goes here");
これは使用する準備ができていますが、それを変更したい場合は 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
今度はそれを修正したい時はいつも buildUpon()そして最後に build()が必要です。
so Uri.Builderはその中にBuilderを格納する Builder 型です。 Uri は Built 型で、すでに構築されているURIをその中に格納します。
new Uri.Builder(); Builder に戻る。 Uri.parse("your URIがここに移動します ")は Built を返します。
そして build()であなたはそれを Builder から Built に変更することができます。 buildUpon() Built から Builder に変更できます。
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
そしてまたその逆: -
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();
私の答えが助けてくれることを願っています:) <3
second
Answer
の例では、この手法を同じ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);
それから構築が終わったら、このようにURL
として取得してください
URL url = new URL(builder.build().toString());
そして接続を開く
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
linkがlocation uriのようにsimple
であれば、例えば
geo:0,0?q=29203
Uri geoLocation = Uri.parse("geo:0,0?").buildUpon()
.appendQueryParameter("q",29203).build();
appendEncodePath()
を使用すると、appendPath()
よりも複数の行を節約できます。次のコードスニペットでこの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());
これはラムダ式でできます。
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();
}
そして、あなたはそのようなパラメータを作成することができます。
Map<String, String> params = new HashMap<String, String>();
params.put("Zip", "94043,us");
params.put("units", "metric");
ところで“lambda expressions not supported at this language level”
のような問題に直面するならば、このURLをチェックしてください。