gpt4 book ai didi

android - Retrofit 2 在拦截中将帖子附加到请求体

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:58 26 4
gpt4 key购买 nike

我有这个:

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);
}
});

但也想将一个额外的 post key-value 附加到包含 userkey 的请求正文中。这看起来像

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

最佳答案

附加到 RequestBody 不是直截了当的。这是将添加一个 post 参数的自定义 RequestBody 的草图。几个注意事项——您需要添加一些错误检查,例如确保现有正文不为空。给定的代码还假定所有对该拦截器的调用都是 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 注释,并在每次调用时将其传递,但​​我假设您试图避免这种情况。

关于android - Retrofit 2 在拦截中将帖子附加到请求体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com