安卓改造参数化@Headers

2022-08-31 11:43:31

我正在使用OAuth,每次发出请求时都需要将OAuth令牌放在我的标头中。我看到注释,但是有没有办法让它参数化,以便我可以在运行时传入?@Header

这是概念

@Header({Authorization:'OAuth {var}', api_version={var} })

你能在运行时传递它们吗?

@GET("/users")
void getUsers(
    @Header("Authorization") String auth, 
    @Header("X-Api-Version") String version, 
    Callback<User> callback
)

答案 1

除了使用@Header参数之外,我宁愿使用RequestInterceptor来更新所有请求,而无需更改接口。使用类似如下内容:

RestAdapter.Builder builder = new RestAdapter.Builder()
    .setRequestInterceptor(new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Accept", "application/json;versions=1");
            if (isUserLoggedIn()) {
                request.addHeader("Authorization", getToken());
            }                    
        }
    });

p/s : 如果您使用的是 Retrofit2,则应使用InterceptorRequestInterceptor

由于在改造 2.0 中不再可用RequestInterceptor


答案 2

是的,您可以在运行时传递它们。事实上,几乎和你打出来的一模一样。这将在你的API接口类中,命名为SecretApiInterface.java

public interface SecretApiInterface {

    @GET("/secret_things")
    SecretThing.List getSecretThings(@Header("Authorization") String token)

}

然后,您将参数从您的请求传递到此接口,如下所示:(例如,此文件将是SecretThingRequest.java)

public class SecretThingRequest extends RetrofitSpiceRequest<SecretThing.List, SecretApiInteface>{

    private String token;

    public SecretThingRequest(String token) {
        super(SecretThing.List.class, SecretApiInterface.class);
        this.token = token;
    }

    @Override
    public SecretThing.List loadDataFromNetwork() {
        SecretApiInterface service = getService();
        return service.getSecretThings(Somehow.Magically.getToken());
    }
}

返回令牌的方法调用在哪里,这取决于您定义令牌的位置和方式。Somehow.Magically.getToken()

当然,您可以在接口实现中使用多个@Header(“Blah”)字符串blah注释,就像您的情况一样!

我也发现它令人困惑,文档清楚地说它取代了标题,但它没有
它实际上是与注释一起添加的@Headers("hardcoded_string_of_liited_use")

希望这有助于;)


推荐