相关疑难解决方法(0)

用okhttp替换改造2中的公共路径参数

我有一些具有相同baseUrl的服务URL.对于某些网址,会有一些常用的参数,例如apiVersionlocale.但它们不必存在于每个URL中,因此我无法将它们添加到baseUrl中.

.../api/{apiVersion}/{locale}/event/{eventId}
.../api/{apiVersion}/{locale}/venues
.../api/{apiVersion}/configuration
Run Code Online (Sandbox Code Playgroud)

我不想在改装界面中添加这些参数.在改造1中,我制作了一个拦截器并用于RequestFacade.addPathParam(..., ...)填充每个URL的这些常用路径参数.

对于改造2,我似乎找不到用okhttp做这个的正确方法.我现在看到这种可能性的唯一方法是HttpUrlChain.request().httpUrl();一个okhttp中获取Interceptor并自己操纵那个,但我不知道这是否是最好的方法.

有没有人遇到过更好的方法来替换okhttp中的路径参数Interceptor

在撰写本文时,我正在使用改进:2.0.0-beta2和okhttp:2.7.2.

android okhttp retrofit2

13
推荐指数
1
解决办法
1803
查看次数

PATH中的改进和斜杠字符

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

我面临的问题是PATH部分来自响应对象的后端,这意味着所有PATH的字符串已经在之后的其他响应中从后端格式化,如下所示:

Object : {
    href: "/resources/login..."
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当包含类似这样的内容时,URL会格式错误:

@GET("{/loginHref}")
    void login(@EncodedPath("loginHref") String loginHref,
               Callback<User> callback);
Run Code Online (Sandbox Code Playgroud)

类似于" http://mybaseurl.com//resources/login"*在资源面前加倍//

这肯定会导致某些端点出现问题,除了执行以下操作之外,我无法想出解决此问题的简单方法:

a)修改我自己的改造版本以删除该/字符检查(这是最后的手段)

b)在从界面使用该方法之前截断href(我不惜一切代价避免使用该方法,并且会在整个地方添加不必要的转换.

c)拦截请求并在发生此情况时正确形成URL(同样非常难看的解决方案).

有什么想法,建议?

谢谢!

android retrofit

10
推荐指数
1
解决办法
3389
查看次数

Retrofit - 具有相同RestAdapter的多个端点

我想知道如何创建一个可以在两个端点之间切换的RestAdapter.目前在我的应用程序中,RestAdapter是在Application类(singleton)中创建的.我正在寻找一种方法来获得不同的端点,而无需实际创建多个RestAdapter.

android retrofit

10
推荐指数
2
解决办法
4403
查看次数

如何使用Retrofit解决多个API端点?

在我的Android项目中,我使用以下Retrofit ApiModule作为一个 API端点.请注意,我使用Dagger注入依赖项.

@Module(
        complete = false,
        library = true
)
public final class ApiModule {

    public static final String PRODUCTS_BASE_URL = "https://products.com";

    @Provides
    @Singleton
    Endpoint provideEndpoint() {
        return Endpoints.newFixedEndpoint(PRODUCTS_BASE_URL);
    }

    @Provides
    @Singleton
    ObjectMapper provideObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
        return objectMapper;
    }

    @Provides
    @Singleton
    RestAdapter provideRestAdapter(
        Endpoint endpoint, ObjectMapper objectMapper) {
        return new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.NONE)
                .setEndpoint(endpoint)
                .setConverter(new JacksonConverter(objectMapper))
                .build();
    }

    @Provides
    @Singleton
    ProductsService provideProductsService(RestAdapter restAdapter) {
        return restAdapter.create(ProductsService.class);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,还有 …

rest android retrofit

7
推荐指数
1
解决办法
2803
查看次数

改造1.6:使用不同的(TCP)-Ports调用RestService

我必须与以下四个RESTServices进行通信.

Germany (Default): http://url.com/suggest?query=
Austria http://url.com:82/suggest?query=
Swiss: http://url.com:83/suggest?query=
Spain: http://url.com:84/suggest?query=
Run Code Online (Sandbox Code Playgroud)

基本上我必须在每个国家/地区的不同TCP端口上调用相同的RESTService.当我创建一个Retrofit-RestAdapter时,我必须提供一个端点(base-url):

RestAdapter.Builder builder = new RestAdapter.Builder();
    ObjectMapper mapper = new ObjectMapper();
    builder.setEndpoint("http://url.com");
Run Code Online (Sandbox Code Playgroud)

如果我想访问上面提到的那四个RESTServices,我是否必须为它们中的每一个创建一个RestAdapter?或者是否可以只使用一个RestAdapter实例?

我尝试通过添加TCP-Port作为RestInterface-annotation的一部分来解决问题,但这不起作用:

public interface AutoSuggestRemote {
    @GET (":{port}/suggest")
    public Response getSuggestions(@Path ("port") Integer httpPort, @Query ("query") String query);
}
Run Code Online (Sandbox Code Playgroud)

我在Logcat中得到以下异常:

java.lang.IllegalArgumentException: AutoSuggestRemote.getSuggestions: URL path ":{port}/suggest" must start with '/'.
        at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:123)
        at retrofit.RestMethodInfo.parsePath(RestMethodInfo.java:212)
        at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:165)
        at retrofit.RestMethodInfo.init(RestMethodInfo.java:133)
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:294)
        at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
        at $Proxy3.getSuggestions(Native Method)
Run Code Online (Sandbox Code Playgroud)

因此我的问题是,如果我必须为每个RESTService创建一个RestAdapter实例,或者是否有办法通过使用相同的RestAdapter实例与所有四个服务进行通信.

rest port android retrofit

5
推荐指数
1
解决办法
3083
查看次数

标签 统计

android ×5

retrofit ×4

rest ×2

okhttp ×1

port ×1

retrofit2 ×1