Retrofit:如何在接口中添加运行时参数?

5

我希望在我的Retrofit调用中始终添加一个参数。对于我可以硬编码的值,我只需使用

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

但是如果我想附加 android.os.Build.MODEL 该怎么办?

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

无法正常工作。将这部分网络调用抽象出来并与实现代码分离将非常有用。
编辑: 通过使用请求拦截器,我可以在所有 api 调用中添加 Build.MODEL。然而,我仍然不知道如何仅对某些 api 调用添加它,同时仍然使用相同的 RestAdapter。
编辑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);

我目前使用一个RequestInterceptor来向所有API调用添加参数,然后在不需要这些参数的调用中忽略额外的参数。这种方法虽然可行,但会使代码变得不够清晰,因为无法确定哪些调用需要哪些默认参数,所以我将保持这个问题的开放状态。 - GDanger
1个回答

7

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

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

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

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

在调用API时,您需要传递Build.MODEL。如果您愿意,您可以将Retrofit接口封装在一个更友好的应用程序层API中,此API会为您完成这项工作。


有没有一种方法可以有选择性地针对哪些API调用RequestInterceptor进行拦截并添加参数? - GDanger
不,它适用于当前所有的方法。 - Jake Wharton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接