我正在开发一个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?


当前回答

优秀的答案从上面变成了一个简单的实用方法。

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

其他回答

优秀的答案从上面变成了一个简单的实用方法。

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

对于第二个答案中的例子,我对相同的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应用程序

假设我想创建以下URL:

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

用Uri来构建这个。我会做以下事情。

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

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