【问题标题】:Static headers and dynamic headers issue in retrofit改造中的静态标题和动态标题问题
【发布时间】:2021-09-28 12:25:08
【问题描述】:

我需要有关 Java 改造请求的帮助:

场景 1:我添加了一个具有少量静态标头的拦截器

场景 2:在请求 API 时,同时发送少量动态标头

当请求完成时,我会检查如下的请求标头。

response.raw().request().headers()

我可以看到静态标题但看不到动态标题。

下面是Interceptor设置静态头的代码:

public class AuthInterceptor implements Interceptor {

    public AuthInterceptor() {
    }

    protected String authtoken;

    public AuthInterceptor(String authtoken) {
        defaultHeader();
        this.authtoken = authtoken;
    }

    public void setAuthtoken(String authtoken) {
        this.authtoken = authtoken;
    }

    private Headers.Builder defaultHeader() {
        final String xUserAgent = Util.SDK_NAME + "/" + Util.SDK_VERSION;
        return new Headers.Builder()
                .add("X-User-Agent", xUserAgent)
                .add("User-Agent", Util.defaultUserAgent())
                .add("Content-Type", "application/json");
    }

    public Headers.Builder addHeader(@NotNull String key, @NotNull String value) {
        defaultHeader().add(key, value);
        return defaultHeader();
    }

    @NotNull
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder request = chain.request().newBuilder()
                .headers(defaultHeader().build());

        if (this.authtoken != null) {
            request.addHeader("authtoken", this.authtoken);
        }
        return chain.proceed(request.build());
    }


}

并发送如下动态标头。

    @POST("stacks")
    Call<ResponseBody> create(
            @Header("organization_uid") String orgUid,
            @Body RequestBody body);

【问题讨论】:

  • 你能贴出你用来设置标题的代码吗?
  • 在问题中添加了详细信息(代码)。请验证
  • 语法看起来应该可以工作。您是否在 null 检查之前打印出 authToken,以确保它按预期设置?
  • 是的! authtoken 与所有其他静态标头一起工作正常。问题在于我发送的动态标头未附加到请求我可以通过以下方式查看请求标头:response.raw().request().headers()

标签: http header retrofit2 httpclient interceptor


【解决方案1】:

在我看来问题出在您的使用中:

Request.Builder request = chain.request().newBuilder()
            .headers(defaultHeader().build());

如果您查看 'headers' 方法的文档,它指出:删除此构建器上的所有标题并添加 {@code headers}。

只需用 addHeader 添加每个标题就可以了。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2019-07-04
    • 1970-01-01
    • 2021-09-05
    • 2023-03-16
    • 2019-06-23
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多