当前位置: 首页 > 知识库问答 >
问题:

Android:如何在同一服务调用中设置静态头和动态头?这可能吗?

胡天佑
2023-03-14

我有一个像需要传递一个头作为参数的场景

@GET("mobile/userProfile")
Observable<ProfileDetail> getImageUrlDetail(@Header("contentType") String contentType,
                                              @Query("pictureName") String fileName);

我还需要设置授权和X-API密钥。

所以我创建了一个定制的拦截器,并在这个拦截器中添加了授权和X-API密钥。

但是只有一个报头在静态或动态报头中工作。两个标题都应设置为OkHttpClient。否则,我将收到400个错误请求。

OkHttpClient okHttpClient = new okhttp3.OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS) // 30 seconds Connection Timeout
                .readTimeout(60, TimeUnit.SECONDS) // 60 seconds Read Timeout
                .addInterceptor(interceptor)
                .addInterceptor(logging)
                .build();

奇怪的场景是如果先添加我的自定义拦截器,然后再记录拦截器。它在logcat中提供了自定义拦截器的HEADERS。如果我切换行,. addInterceptor(日志). addInterceptor(拦截器)然后我在logcat中得到@Header,它作为参数传递。

我想将两个标头都设置为API调用get 200响应。

非常欢迎提出建议和解决办法。谢谢

共有1个答案

傅新
2023-03-14

关于你的代码和问题有一些事情。让我尽我所能帮你解决所有这些问题。

第一

奇怪的场景是如果先添加我的自定义拦截器,然后再记录拦截器。它在logcat中提供了自定义拦截器的HEADERS。如果我切换行,. addInterceptor(日志). addInterceptor(拦截器)然后我在logcat中得到@Header,它作为参数传递。

如果我做对了,那就是100%预期的,这就是它的工作原理。拦截器就像一条链,所以当你这样做的时候

.addInterceptor(interceptor)
.addInterceptor(logging)

然后它将首先运行拦截器,我猜它添加了api键,然后它将运行日志记录拦截器,它将记录到目前为止添加到请求中的所有标头。@Header是通过改造而不是OkHttp添加的,所以即使您没有任何拦截器,它也应该在那里,并且它会在okhttp拦截器有机会启动之前就在那里。

如果您将其切换:

.addInterceptor(logging)
.addInterceptor(interceptor)

然后您将首先登录-尚未添加api密钥标头-然后您添加api密钥标头。这就是为什么在log cat中,如果您这样做,您不会看到添加了api密钥标头,但您会看到@Header。根据经验,始终将日志记录放在链中的最后一个。

在这两种情况下,无论拦截器的顺序如何,都应将这两个标头添加到最终请求中。如果不是这种情况,那么还有其他东西会弄乱标题。

现在进入静态与动态标头。据我所知,这些应该可以很好地协同工作。我猜它不起作用的是你有@Header(“contentType”) - 注意你是如何编写contentType的?如果我正确理解这个标准,它应该是内容类型的。因此,如果您将其更改为@Header(“内容类型”),它应该可以正常工作。

希望这有帮助

 类似资料:
  • 我使用的API使用授权方案,该方案需要设置特殊的“X-Authoration”标头来验证请求。例如,此Retrofit设置非常适合身份验证令牌为的用户: 我缓存了用户的X-Authorization令牌,所以我可以访问它,但是,我不能在@Headers声明中删除它。 我在这里得到一个编译错误: 有什么办法可以绕过这个吗?

  • 问题内容: 我正在写一些演示Web服务器,提供静态html,css和javascript。服务器看起来像 我的客户端javascript使ajax调用到其他服务器。我该如何添加 对我的服务器响应,以便客户端javascript可以进行ajax调用? 问题答案: 自从Express宠坏了我以来,弄清楚这个问题有点麻烦。 看看enable cors。基本上,您需要做的是添加到要启用cors的域中。re

  • 我有以下java代码: 我的问题如下:我收到一个文本和一种语言,我必须检查该文本是否仅使用该语言的有效字母字符书写。我的代码如下: 这很好,也很有效,但随着我在应用程序中添加语言,我将不得不在交换机中添加越来越多的案例。 我想知道在中是否有一种方法可以动态命名一个静态嵌套类,比如: 所以我上面的代码可能是这样的: 谢谢,如果这是超级简单的事情,我很抱歉。 我是一名开发人员,正在学习。

  • 问题内容: 我想让服务提供以下代码中的资源: 然后,当使用该操作时,我想动态传递一个HTTP标头,这意味着它可能随每次调用而改变。这是一个示例,在控制器中,请参见代码中的注释: 您知道直接或通过技巧做到这一点的方法吗? 最后的想法 接受的答案不能完全回答问题,因为标头不是完全动态的,因为工厂实际上返回了工厂(!),而我的代码中不是这种情况。 由于$ resource是工厂,因此无法使其动态化。 最

  • 一个trait中的静态函数可以调用同一trait中的另一个静态函数吗?假设我有以下特点: 那不行。代码不能在这里编译。 此外,没有类型让我使用完全限定的语法,如

  • 正常的摄像头一般使用独立组件或者 rtsp 组件即可接入 Home Assistant,但是小米已屏蔽其下所有摄像头设备中 rtsp 的开放接口。因此将小米生态链所产摄像头接入 HA,均需要 hack 系统固件。 小蚁摄像头 Hack 详细说明请参考 Hack 项目地址,此处做简单翻译整理。 从 此处 获取对应设备固件 型号 rootfs 分区版本 home 分区版本 Remarks Yi Hom