Модернизация ПОСТ. Добавить параметр JSON в каждый запрос на публикацию - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть четыре статических параметра, которые мне нужно установить для каждого запроса на пост-модификацию только один раз, потому что мне не нужно каждый раз ставить их в каждом запросе. Это мой код:

  public interface Login {
        @POST("login")
        @Headers("Content-Type: application/json")
        Call<String> login(@Body JsonObject json);
    }

тогда я вызываю его и передаю электронную почту и пароль в качестве параметров тела, таких как:

  private void sendLoginRequest() {
    API.login().login(CommandLogin.getInputParamsAsJSON(mStrEmail, Utils.md5(mStrPassword))).enqueue(this);
}

затем в intercept body я попытался передать эти статические параметры, но когда я проверяю log , кажется, что передаются только эти два статических параметра без электронной почты и пароля. В моей ситуации я хочу вставить body email , пароль , os , версия .

public class API {

private static <T> T builder(Class<T> endpoint) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(
                    new Interceptor() {
                        @Override
                        public Response intercept(Interceptor.Chain chain){
                            try {
                                Request original = chain.request();

                                JSONObject params = new JSONObject();
                                params.put("version"        , "6");
                                params.put("os"             , "2");

                                MediaType JSON = MediaType.parse("application/json; charset=utf-8");
                                RequestBody body = RequestBody.create(JSON, params.toString());

                                Request.Builder requestBuilder = original.newBuilder()
                                        .post(body);

                                Request request = requestBuilder.build();

                                return chain.proceed(request);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            //TODO
                            return null;
                        }
                    })
            .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .build();

    return new Retrofit.Builder()
            .baseUrl(Utils.BASE_COMPONENT_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build()
            .create(endpoint);
}



public static Login login() {
    return builder(Login.class);
}

}

1 Ответ

1 голос
/ 24 апреля 2019

Это потому, что вы в основном перезаписываете исходное тело запроса на вход в систему новыми параметрами.Вместо этого вам нужно получить тело сообщения из исходного запроса и добавить к нему новые параметры.

Нечто подобное ниже (код не проверен)

try {
    // Create new buffer
    final Buffer buffer = new Buffer();

    // Copy original request's json body to buffer
    chain.request().body().writeTo(buffer);

    // Convert buffer to JSONObject
    JSONObject params = new JSONObject(buffer.readUtf8());

    // Append new params
    params.put("version", "6");
    params.put("os", "2");

    // Now the params json object will have all 4 values: email,password,os,version

    // TODO: Your remaining code

} catch (Exception ex) {
    Log.d("Login","Error creating post body", ex);
}
...