gpt4 book ai didi

android - 在 Retrofit 中的请求正文之前添加字符串

转载 作者:行者123 更新时间:2023-11-29 01:26:45 25 4
gpt4 key购买 nike

我想在 Retrofit 请求中的请求主体之前添加字符串。我的意思是:

data={"action":"users.login","data":{"email":"test@gmail.com", "password":"password"}}

但 Retofit 只允许这样的请求:

{"action":"users.login","data":{"email":"test@gmail.com", "password":"password"}}

这是我在接口(interface)中的方法代码:

@POST("/api")
Observable<RequestResult> loginAction(@Body Request<User> userRequest);

这是登录 Activity 的代码:

User user = new User();
user.setEmail("email");
user.setPassword("password");

subscription.add(
service.loginAction(
new Request<>("users.login", user))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<RequestResult>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(RequestResult requestResult) {
}
})
);

最佳答案

首先,如果您想在每个请求之前添加字符串,可以使用 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;
}

});

但是,我只对指定的Header使用这种方式,而不是对指定的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":"test@gmail.com", "password":"password"}}}

最后,我建议您使用一个包装器类 UserData,在请求字符串中封装“data=”。

我使用 Retrofit 2.0 beta 2。

祝你好运!

关于android - 在 Retrofit 中的请求正文之前添加字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33591333/

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