gpt4 book ai didi

android - 为什么 Retrofit 向所有 URL 添加尾部斜杠?

转载 作者:太空狗 更新时间:2023-10-29 13:22:09 24 4
gpt4 key购买 nike

使用更多详细信息编辑问题:

我了解 Retrofit 中服务接口(interface)的使用。我想调用这样的 URL: http://a.com/b/c (然后使用服务接口(interface)附加查询参数)。

我的限制是:

  1. 不能将/b/c 用作服务接口(interface)的一部分(作为路径参数)。我需要它作为基本网址的一部分。我在下面详细说明了原因。

  2. 无法负担得起对http://a.com/b/c/?key=val的结果调用.我需要的是 http://a.com/b/c?key=val (“c”后的尾部斜线为我的 API 带来了问题)。下面有更多详细信息。

我的服务器 API 变化非常频繁,我在客户端使用 Retrofit 时遇到了麻烦。主要问题是我们不能将动态值(非最终值)传递给路径参数的@GET 或@POST 注释(就像查询参数一样)。例如,当 API 更改时,甚至路径参数的数量也会更改。每次 API 更改时,我们都无法承受不同的接口(interface)。

一个解决方法是形成完整的 URL,即具有 Base_Url + Path_Parameters 的端点。

但我想知道为什么 Retrofit 会强制在基本 url 中添加尾部斜杠(“/”):

        String API_URL = "https://api.github.com/repos/square/retrofit/contributors";
if (API_URL.endsWith("/")) {
API_URL = API_URL.substring(0, API_URL.length() - 1);
}
System.out.println(API_URL); //prints without trailing "/"

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)
.build();

API_URL 总是重置为 https://api.github.com/repos/square/retrofit/contributors/通过内部改造(通过记录请求确认这一点)

一个解决方法是手动添加“?”最后防止添加“/”:https://api.github.com/repos/square/retrofit/contributors

很遗憾,我们的 API 不会接受此类请求。

  1. 为什么 Retrofit 会强制执行此行为?
  2. 对于像我这样不想要尾部斜杠的人,是否有解决方案?
  3. 我们可以将可变参数(非最终)传递给 Retrofit @GET 或 @POST 注释吗?

最佳答案

您需要将基本 URL 传递给 setEndpoint(...) 并在您的服务接口(interface)中定义 /repos/...

快速演示:

class Contributor {

String login;

@Override
public String toString() {
return String.format("{login='%s'}", this.login);
}
}

interface GitHubService {

@GET("/repos/{organization}/{repository}/contributors")
List<Contributor> getContributors(@Path("organization") String organization,
@Path("repository") String repository);
}

然后在您的代码中,您可以:

GitHubService service = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build()
.create(GitHubService.class);

List<Contributor> contributors = service.getContributors("square", "retrofit");
System.out.println(contributors);

将打印:

[{login='JakeWharton'}, {login='pforhan'}, {login='edenman'}, {login='eburke'}, {login='swankjesse'}, {login='dnkoutso'}, {login='loganj'}, {login='rcdickerson'}, {login='rjrjr'}, {login='kryali'}, {login='holmes'}, {login='adriancole'}, {login='swanson'}, {login='crazybob'}, {login='danrice-square'}, {login='Turbo87'}, {login='ransombriggs'}, {login='jjNford'}, {login='icastell'}, {login='codebutler'}, {login='koalahamlet'}, {login='austynmahoney'}, {login='mironov-nsk'}, {login='kaiwaldron'}, {login='matthewmichihara'}, {login='nbauernfeind'}, {login='hongrich'}, {login='thuss'}, {login='xian'}, {login='jacobtabak'}]

Can we have variable parameters (non final) being passed to Retrofit @GET or @POST annotations ?

不可以,(Java) 注释中的值必须声明为 final。但是,您可以定义变量路径,正如我在演示中展示的那样。

编辑:

请注意 Jake 在评论中的评论:

Worth noting, the code linked in the original question deals with the case when you pass https://api.github.com/ (note the trailing slash) and it gets joined to /repos/... (note the leading slash). Retrofit forces leading slashes on the relative URL annotation parameters so it de-dupes if there's a trailing slash on the API url.

关于android - 为什么 Retrofit 向所有 URL 添加尾部斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com