改造:向接口添加运行时参数?

时间:2014-09-03 20:39:13

标签: android retrofit

我想总是在我的Retrofit调用中添加一个参数。对于我可以硬编码的值,我可以简单地使用

@POST("/myApi?myParam=myValue")

但如果我想追加android.os.Build.MODEL怎么办?

@POST("/myApi?machineName="+ Build.MODEL)

不起作用。能够将这部分网络调用从实现代码中抽象出来是很有用的。

修改

我可以使用Build.MODEL为我的所有api电话添加RequestInterceptor。但是,如果仍然使用相同的RestAdapter,我仍然无法选择性地将其添加到我的某些api调用中。

编辑2

修正了各种错误的标题。

编辑3

目前的实施:

RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("myapi")
            .setRequestInterceptor(new RequestInterceptor() {
                @Override
                public void intercept(RequestInterceptor.RequestFacade request) {
                    request.addQueryParam("machineName", Build.MODEL);
                }
            })
            .build();
    API_SERVICE = restAdapter.create(ApiService.class);

1 个答案:

答案 0 :(得分:7)

Build.MODEL无法在注释中使用,因为它无法在编译时解析。它仅在运行时可用(因为它从属性加载)。

有两种方法可以实现这一目标。第一个是使用你在问题中提到的RequestInterceptor

第二个是在方法上使用@Query参数。

@POST("/myApi")
Response doSomething(@Query("machineName") String machineName);

这要求您在调用API时传递Build.MODEL。如果需要,可以将Retrofit界面包装在一个对应用程序层更友好的API中。