我正在开发一个Android应用程序。我需要为我的应用程序构建一个URI来进行API请求。除非有其他方法可以在URI中放入变量,否则这是我发现的最简单的方法。我发现你需要使用Uri。我是建筑工,但我不知道怎么做。我的url是:
http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value
我的方案是http,权限是lapi.transitchicago.com,路径是/api/1.0,路径段(s)是ttarrival。查询字符串为key=[reacted]&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。添加,但我如何将它集成到Uri.Builder?我是否应该添加所有内容,如URI.add(scheme), URI.add(authority)等等?还是说这不是解决问题的方法?还有,有没有其他更简单的方法来添加一个变量到URI/URL?
对于第二个答案中的例子,我对相同的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();
如果链接很简单,比如location uri
地理:0,0 ?q = 29203
Uri geoLocation = Uri.parse("geo:0,0?").buildUpon()
.appendQueryParameter("q",29203).build();
下面是一个很好的解释:
URI有两种形式
1 -构建器(准备修改,不准备使用)
2 -已建成(不准备修改,准备使用)
您可以通过
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();
或者你怎么使用它。
然后你构建了已经为你构建好的,可以使用但不能修改的。
Uri built = Uri.parse("your URI goes here");
这是可以使用的,但如果你想修改它,你需要buildupont ()
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
现在,每次你想要修改它,你都需要buildpon(),最后build()。
所以Uri。Builder是一个Builder类型,在其中存储一个Builder。
Uri是一个内置类型,其中存储了一个已经构建的Uri。
新Uri.Builder ();返回一个构建器。
Uri。parse("your URI goes here")返回一个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();
希望我的回答能有所帮助
你可以用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();
}
你可以创建这样的参数;
Map<String, String> params = new HashMap<String, String>();
params.put("zip", "94043,us");
params.put("units", "metric");
顺便说一句。如果您将遇到诸如“此语言级别不支持lambda表达式”之类的问题,请检查此URL;
https://stackoverflow.com/a/22704620/2057154
对于第二个答案中的例子,我对相同的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();
如果链接很简单,比如location uri
地理:0,0 ?q = 29203
Uri geoLocation = Uri.parse("geo:0,0?").buildUpon()
.appendQueryParameter("q",29203).build();
还有另一种使用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());
来源:Udacity Android课程/ Sunshine应用程序