我正面临着Retrofit的问题,并希望找到一个合适的答案,因为我能想到它的唯一方法是非常丑陋而且不实用。
改造PATH注释需要" /"在开头(正如您可以阅读从库源中提取的代码:
/** Loads {@link #requestUrl}, {@link #requestUrlParamNames}, and {@link #requestQuery}. */
private void parsePath(String path) {
if (path == null || path.length() == 0 || path.charAt(0) != '/') {
throw methodError("URL path \"%s\" must start with '/'.", path);
}
我面临的问题是PATH部分来自响应对象的后端,这意味着所有PATH的字符串已经从之前的后端格式化,如下所示:
Object : {
href: "/resources/login..."
}
正如您所看到的,当包含类似这样的内容时,网址格式不正确:
@GET("{/loginHref}")
void login(@EncodedPath("loginHref") String loginHref,
Callback<User> callback);
类似&#34; http://mybaseurl.com//resources/login&#34; *在资源面前加倍//
这肯定会导致某些端点出现问题,除了做类似的事情之外,我无法想出一个解决这个问题的简单方法:
a)修改我自己的改装版本以删除该/字符检查(这是最后的手段)
b)在从界面使用该方法之前截断href(我不惜一切代价避免使用该方法,并且会在整个地方添加不必要的转换。
c)拦截请求并在发生此情况时正确形成URL(同样非常难看的解决方案)。
有什么想法,建议吗?
谢谢!
答案 0 :(得分:3)
我认为此链接可以帮助您Path Replacement
您的新实施将如下所示。
@GET("/")
void login(Callback<User> callback);
您可以提供自定义端点实现,您可以在其上更改相对路径。
public final class CustomEndpoint implements Endpoint {
private static final String BASE = "http://192.168.1.64:5050/api/";
private String url;
private String href;
public CustomEndpoint(String href){
this.href = href;
url = BASE + this.href;
}
@Override public String getName() {
return "default";
}
@Override public String getUrl() {
if (url == null) throw new IllegalStateException("relative path not set.");
return url;
}
}
用法如下
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(new CustomEndPoint(object.href));
then restadapter.create........
希望这会对你有所帮助。