首先,如果要在每个请求之前添加字符串,可以使用OkHttp interceptor指定它们。
就这样,
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
String time = DateUtil.getDefaultDateTime(new Date());
RequestBody body = request.body();
String bodyData = "data=";
if (body != null) {
Buffer bufferedSink = new Buffer();
request.body().writeTo(bufferedSink);
bodyData += bufferedSink.readUtf8();
}
String tokenData = AppContext.get(ContextConstant.TOKEN, "");
String keyData = request.url() + bodyData + time + tokenData;
String key = Encryption.genKey(keyData);
String userId = AppContext.get(ContextConstant.CURRENT_USER_ID, "");
String authorization = Encryption.getHeaderValue(userId, AppContext.getInstance().getUUID());
Request.Builder requestBuilder = request.newBuilder();
requestBuilder.header("X-key", key);
requestBuilder.header("Authorization", authorization.replace("\n", ""));
requestBuilder.header("X-API-Version", AppConstant.API_VERSION);
requestBuilder.header("X-Data-version", AppConstant.DATA_VERSION);
requestBuilder.header("X-Request-Time", time);
Request okRequest = requestBuilder.build();
Response response = chain.proceed(okRequest);
return response;
}
});
不过,我只用这样的方式指定标题,而不是指定的RequestBody。
其次,如果你使用GSON,(不幸的是,你没有)
Gson gson = new GsonBuilder()
.setDateFormat(DateUtil.FORMAT)
.registerTypeAdapter(User.class, new UserDeserializer())
.registerTypeAdapter(User.class, new UserSerializer())
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppConstant.HOST)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
在UserSerializer,
public class UserSerializer implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive("data=" + src.toString());
}
}
我认为这可能由是圆{ } ....
{data={"action":"users.login","data":{"email":"[email protected]", "password":"password"}}}
最后,我建议你在请求字符串中使用封装类UserData封装“data =”。
我使用Retrofit 2.0 beta 2.
祝你好运!