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


当前回答

最佳答案:https://stackoverflow.com/a/19168199/413127

的例子

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

现在是Kotlin

 val myUrl = Uri.Builder().apply {
        scheme("https")
        authority("www.myawesomesite.com")
        appendPath("turtles")
        appendPath("types")
        appendQueryParameter("type", "1")
        appendQueryParameter("sort", "relevance")
        fragment("section-name")
        build()            
    }.toString()

其他回答

下面是一个很好的解释:

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

希望我的回答能有所帮助

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

假设我想创建以下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();

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

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

你可以用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