Nic*_*ila 4 android retrofit okhttp
我有这个:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
但是还想在包含userkey的请求主体中附加一个post key-value.这看起来像
RequestBody newBody = RequestBody.create(request.body().contentType(),request.body().content+ request.addPost("sUserKey","3254345kdskf");
...
...
Request newRequest = chain.request()
.newBuilder()
.url(url)
.post(newBody)
.build();
Run Code Online (Sandbox Code Playgroud)
附加RequestBody不是直截了当的.以下是RequestBody将添加post参数的自定义草图.几点需要注意 - 您需要添加一些错误检查,例如确保现有主体不为空.给定代码还假设所有来到此拦截器的调用都是POST.如果不是这种情况,您需要在应用新主体之前检查传入的请求类型.此外,由于这只是将新参数复制到正文中,因此您需要确保名称和正文已根据需要进行了网址编码.
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在你的拦截器中使用 -
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);
}
});
Run Code Online (Sandbox Code Playgroud)
您的另一个选择是Field在您的改装定义中包含一个额外的注释,并在每次调用时传递它,但我认为您试图避免这种情况.
您无需创建额外的类即可做到这一点。
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);
}
});
Run Code Online (Sandbox Code Playgroud)
这是创建新请求的简单方法。
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();
}
Run Code Online (Sandbox Code Playgroud)
您也可以从Gist获取它
| 归档时间: |
|
| 查看次数: |
3906 次 |
| 最近记录: |