在Android中使用URI构建器或使用变量创建URL

hic*_*123 190 android uri uribuilder

我正在开发一款Android应用.我需要为我的应用程序构建一个URI来发出API请求.除非有另一种方法将变量放在URI中,否则这是我发现的最简单的方法.我发现你需要使用Uri.Builder,但我不太清楚如何使用.我的网址是:

http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value 
Run Code Online (Sandbox Code Playgroud)

我的方案是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);
Run Code Online (Sandbox Code Playgroud)

我明白我能做到URI.add,但我该如何将其整合到Uri.Builder?我要补充的一切都像URI.add(scheme),URI.add(authority)等等?或者这不是这样做的方法吗?此外,还有其他更简单的方法将变量添加到URI/URL吗?

Dav*_*vid 410

假设我要创建以下网址:

https://www.myawesomesite.com/turtles/types?type=1&sort=relevance#section-name
Run Code Online (Sandbox Code Playgroud)

为了建立这个,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();
Run Code Online (Sandbox Code Playgroud)


Ami*_*thi 233

还有另一种使用方式,Uri我们可以实现相同的目标

http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7
Run Code Online (Sandbox Code Playgroud)

要构建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";
Run Code Online (Sandbox Code Playgroud)

您可以通过上述方式或甚至在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();
Run Code Online (Sandbox Code Playgroud)

最后

URL url = new URL(builtUri.toString());
Run Code Online (Sandbox Code Playgroud)

  • 你应该得到更多的选票!对我来说,基本用例是当你有一个已经定义的字符串URL,并且你想要添加/追加参数! (12认同)
  • 感谢 Uri.buildUpon() 提示!让我免于头疼。 (3认同)

Chr*_*ris 20

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

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();
}
Run Code Online (Sandbox Code Playgroud)


小智 13

这是解释它的好方法:

有两种形式的URI

1 - 构建器(可以修改,准备使用)

2 - 内置(准备好修改,可随时使用)

您可以通过创建构建器

Uri.Builder builder = new Uri.Builder();
Run Code Online (Sandbox Code Playgroud)

这将返回一个生成器准备好像这样修改: -

builder.scheme("https");
builder.authority("api.github.com");
builder.appendPath("search");
builder.appendPath("repositories");
builder.appendQueryParameter(PARAMETER_QUERY,parameterValue);
Run Code Online (Sandbox Code Playgroud)

但要使用它,你必须先建立它

retrun builder.build();
Run Code Online (Sandbox Code Playgroud)

或者你会用它.然后你已经构建了已经为你构建的,随时可以使用但无法修改.

Uri built = Uri.parse("your URI goes here");
Run Code Online (Sandbox Code Playgroud)

这是准备使用但如果你想修改它你需要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
Run Code Online (Sandbox Code Playgroud)

现在每次你想要修改它,你需要buildUpon()和最后的build().

所以Uri.Builder是一个Builder类型,可以在其中存储Builder. Uri是一种Built类型,用于存储已构建的URI

新的Uri.Builder(); 重新生成一个Builder. Uri.parse("你的URI在这里")返回一个Built

并且使用build(),您可以将它从Builder更改为Built. buildUpon() 你可以在这里将内容更改为内置构建器

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
Run Code Online (Sandbox Code Playgroud)

而且相反: -

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();
Run Code Online (Sandbox Code Playgroud)

希望我的回答有帮助:) <3


Bas*_*ANI 6

对于second Answer我在这个例子中使用这种技术的例子

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);
Run Code Online (Sandbox Code Playgroud)

完成建设之后,URL就像这样得到它

URL url = new URL(builder.build().toString());
Run Code Online (Sandbox Code Playgroud)

并打开一个连接

  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
Run Code Online (Sandbox Code Playgroud)

例如,如果链接simple就像位置uri那样

geo:0,0?q=29203

Uri geoLocation = Uri.parse("geo:0,0?").buildUpon()
            .appendQueryParameter("q",29203).build();
Run Code Online (Sandbox Code Playgroud)

  • `URL url = new URL(builder.build().toString());`必须包含一个针对MalformedURLException的try catch块 (2认同)