有没有办法设置一个基本请求参数以包含在使用 Square 的 Retrofit 库发出的每个请求中?

Posted

技术标签:

【中文标题】有没有办法设置一个基本请求参数以包含在使用 Square 的 Retrofit 库发出的每个请求中?【英文标题】:Is there a way to set a base request parameter to be included in every request made with Square's Retrofit library? 【发布时间】:2013-07-08 22:45:45 【问题描述】:

我正在使用 Square 的 Retrofit 库进行短期网络调用。我在每个请求中都包含了一些数据作为@Query 参数。像这样:

@GET("/thingOne.php")
void thingOne(
        @Query("app_version") String appVersion,
        @Query("device_type") String deviceType,
        Callback<Map<String,Object>> callback
);

@GET("/thingTwo.php")
void thingTwo(
        @Query("app_version") String appVersion,
        @Query("device_type") String deviceType,
        Callback<Map<String,Object>> callback
);

必须为Interface 中列出的每个端点定义appVersiondeviceType 很麻烦。有没有办法设置应包含在每个请求中的基本参数集?类似于我们设置普通Authorization Header的方式?

RestAdapter restAdapter = new RestAdapter.Builder()
    .setServer("...")
    .setRequestHeaders(new RequestHeaders() 
        @Override
        public List<Header> get() 
            List<Header> headers = new ArrayList<Header>();
                Header authHeader = new Header(
                    "Authorization", "Bearer " + token);
                headers.add(authHeader);
            
            return headers;
        
    )
    .build();
this.service = restAdapter.create(ClientInterface.class);

【问题讨论】:

【参考方案1】:

您可以通过将自定义 RequestInterceptor 添加到您的 RestAdapter 来确保所有请求都具有这些查询参数

RequestInterceptor requestInterceptor = new RequestInterceptor()

    @Override
    public void intercept(RequestFacade request) 
        request.addQueryParam("app_version", "Version 1.x");
        request.addQueryParam("device_type", "Samsung S4");
    
;

restAdapter.setRequestInterceptor(requestInterceptor)

【讨论】:

是this 你在说什么?我似乎找不到对名为 RequestInterceptor 的类的引用。或者到 RequestFacade。并且 RestAdapter 没有方法setRequestInterceptor。你能提供更多细节吗? 您必须拥有旧版本的 Retrofit。如果您将其更新到 1.1.1 版,您应该会看到它们。 square.github.io/retrofit/javadoc/retrofit/… @kdubb:我如何为 Body 执行此操作?我有一个接受 json 有效负载的 POST。谢谢! @dannyroa RequestInterceptor 允许您设置路径参数、查询参数或标题。我认为 body 被故意遗漏有两个原因:1)并非所有请求都允许一个 body 和 2)它会阻止你设置任何其他 Body 如何通过改造 2.0.0.beta1 做到这一点?

以上是关于有没有办法设置一个基本请求参数以包含在使用 Square 的 Retrofit 库发出的每个请求中?的主要内容,如果未能解决你的问题,请参考以下文章

javascript 有没有办法隐藏get的参数

jenkins 执行可执行jar包测试中,请求乱码解决办法

有没有办法为 1 个请求设置一个 cookie?

有没有办法在客户端禁用字节范围请求?

Http请求-get和post的区别

有没有办法以编程方式请求许可?