【问题标题】:Retrofit 2 appending post to requestbody in intercept改造 2 在拦截中将帖子附加到请求正文
【发布时间】:2015-12-30 23:47:45
【问题描述】:

我有这个:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
    @Override
    public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        HttpUrl url = request.httpUrl().newBuilder()
                     .addQueryParameter("platform", "android")
                     .addQueryParameter("app_version", com.package.BuildConfig.VERSION_NAME)
                     .build();
        Request newRequest = chain.request().newBuilder().url(url).build();
        return chain.proceed(newRequest);
    }
});

但还想在包含 userkey 的请求正文中附加一个额外的 post 键值。这看起来像

    RequestBody newBody = RequestBody.create(request.body().contentType(),request.body().content+ request.addPost("sUserKey","3254345kdskf");
...
...
 Request newRequest = chain.request()
.newBuilder()
.url(url)
.post(newBody)
.build();

【问题讨论】:

  • 有什么问题?
  • 在 okhttp 拦截期间,您将如何添加额外的 POST?
  • 您想向不同的端点发出 post 请求?
  • 不完全。我希望端点保持不变,但要添加其他参数。我要加("sUserkey","345i34oj53i4s")
  • 你想在正文中添加一些东西吗?

标签: android retrofit okhttp


【解决方案1】:

附加到RequestBody 并不简单。这是一个自定义RequestBody 的草图,它将添加一个 post 参数。几个警告——你会想要添加一些错误检查,比如确保现有的正文不为空。给定的代码还假设所有到达此拦截器的调用都是 POST。如果不是这种情况,您需要在应用新正文之前检查传入的请求类型。此外,由于这只是将新参数复制到正文中,因此如果需要,您需要确保名称和正文已经进行了 url 编码。

class AddPostParamRequestBody extends RequestBody {

    final RequestBody body;
    final String parameter;

    AddPostParamRequestBody(RequestBody body, String name, String value) {
        this.body = body;
        this.parameter = "&" + name + "=" + value;
    }

    @Override
    public long contentLength() throws IOException {
        return body.contentLength() + parameter.length();
    }

    @Override
    public MediaType contentType() {
        return body.contentType();
    }

    @Override
    public void writeTo(BufferedSink bufferedSink) throws IOException {
        body.writeTo(bufferedSink);
        bufferedSink.writeString(parameter, Charset.forName("UTF-8"));
    }

} 

然后你可以在你的拦截器中使用——

client.interceptors().add(new Interceptor() {
    @Override
    public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        HttpUrl url = request.httpUrl().newBuilder().addQueryParameter("added", "param").build();
        AddPostParamRequestBody newBody = new AddPostParamRequestBody(request.body(), "sUserKey","3254345kdskf");
        Request newRequest = request.newBuilder().post(newBody).url(url).build();
        return chain.proceed(newRequest);
    }
});

您的另一个选择是在您的改造定义中包含一个额外的 Field 注释并在每次调用时将其传递,但​​我假设您试图避免这种情况。

【讨论】:

  • addQueryParameter("added", "param") 查询中添加的内容和参数是什么意思。?
【解决方案2】:

你可以在不创建额外的类的情况下做到这一点。

client.interceptors().add(new Interceptor() {
    @Override
    public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        String parameter = "&" + name + "=" + value;
        Request newRequest = interceptRequest(request, parameter)
        return chain.proceed(newRequest);
    }
});

这是创建新请求的简单方法。

 public static Request interceptRequest(@NotNull Request request, @NotNull String parameter)
            throws IOException {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        Sink sink = Okio.sink(baos);
        BufferedSink bufferedSink = Okio.buffer(sink);

        /**
         * Write old params
         * */
        request.body().writeTo(bufferedSink);

        /**
         * write to buffer additional params
         * */
        bufferedSink.writeString(parameter, Charset.defaultCharset());

        RequestBody newRequestBody = RequestBody.create(
                request.body().contentType(),
                bufferedSink.buffer().readUtf8()
        );

        return request.newBuilder().post(newRequestBody).build();
    }

你也可以从Gist获得它

【讨论】:

    猜你喜欢
    • 2014-03-27
    • 2016-04-19
    • 1970-01-01
    • 2020-08-11
    • 2019-06-26
    • 1970-01-01
    • 2016-06-18
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多