Gson не может преобразовать ответ API - PullRequest
0 голосов
/ 01 ноября 2019

Я просто пытаюсь показать пользовательские данные после нажатия API с помощью Retrofit. Мой API-ответ:

{ 
   "password":"111222333",
   "name":"test name",
   "email":"testem@gmail.com",
   "username":"test1",
   "customer_id":"201060",
   "phone":"0196789"
}

, но, к сожалению, я получаю

"Ожидается BEGIN_OBJECT, но в строке 1 путь 1, столбец 1, ошибка $».

Я полностью застрял, чтобы показать свой ответ json.

Мой класс User.java:


    public class User {
      @SerializedName("name")
      @Expose
      private String name;
      @SerializedName("email")
      @Expose
      private String email;
      @SerializedName("username")
      @Expose
      private String username;
      @SerializedName("customer_id")
      @Expose
      private String customerId;
      @SerializedName("phone")
      @Expose
      private String phone;
      @SerializedName("password")
      @Expose
      private String password;
      public String getName() {
        return name;
      }
      public String getEmail() {
        return email;
      }
      public String getUsername() {
        return username;
      }
      public String getCustomerId() {
        return customerId;
      }
      public String getPhone() {
        return phone;
      }
      public String getPassword() {
        return password;
      }
    }

Мой класс входа в систему:


    Gson gson = new GsonBuilder().setLenient().create();
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("https://us-central1-gmx-notification.cloudfunctions.net/")
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();
            all_api = retrofit.create(allApi.class);
    private void getUserDetails(String userName,String passWord){
            Call<User> call = all_api.getUserDetails(userName,passWord);
            call.enqueue(new Callback<User>() {
                @Override
                public void onResponse(Call<User> call, Response<User> response) {
                    if(!response.isSuccessful()){
                        Log.d(response.body());
                    }
                    else{
                        User user = response.body();
                        String content = "";
                        content+= "Name: "+user.getName()+"\n";
                        content+= "Email: "+user.getEmail()+"\n";
                        content+= "Customer ID: "+user.getCustomerId()+"\n";
                        content+= "Phone: "+user.getPhone()+"\n";
                        Log.d(content);
                  }
    });
    }

и мой модифицированный API-класс:


    package com.material.components;
    import java.util.List;
    import retrofit2.Call;
    import retrofit2.http.GET;
    import retrofit2.http.Query;
    public interface allApi {
      @GET("login")
      Call <User> getUserDetails(
              @Query("email") String email,
              @Query("password") String password
      );
    }

1 Ответ

2 голосов
/ 01 ноября 2019

Когда я ударил тебя, api https://us-central1-gmx-notification.cloudfunctions.net/login?email=qwery@gmail.com&password=12345678

Я получил этот ответ

Ошибка: не удалось обработать запрос

Так как ваша ошибка говорит, что вы ожидали объект, но получили строку. Итак, либо ошибка на стороне сервера, либо запрос неверный, или вы забыли добавить что-то к запросу (заголовок или что-то еще ...).

Наверняка проблема не в вашей модели, просто не появилась модельчто вы ожидаете в ответе. Добавьте Interceptor в ваш OkHttpClient, чтобы увидеть, что вы получаете, чтобы быть уверенным.

Вам нужно добавить эту зависимость в gradle

implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

А вот пример кода вашего APIэто будет печатать все сетевое содержимое в журнале:

public class NetworkManager {

    private static RESTAuthService restAuthService;

    /*timeout values in seconds*/
    private static final int CONNECTION_TIMEOUT = 10;
    private static final int WRITE_TIMEOUT = 10;
    private static final int READ_TIMEOUT = 10;

    static RESTAuthService getRESTAuthService() {
        if (restAuthService == null) {
            synchronized (NetworkManager.class) {
                if (restAuthService == null) {

                    OkHttpClient client = new OkHttpClient.Builder()
                            .addInterceptor(new RESTInterceptor())
                            .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
                            .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
                            .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
                            .build();

                    Retrofit retrofit = new Retrofit.Builder()
                            .baseUrl(NetworkConfig.BASE_AUTH_URL)
                            .addConverterFactory(GsonConverterFactory.create())
                            .client(client)
                            .build();

                    restAuthService = retrofit.create(RESTAuthService.class);
                }
            }
        }
        return restAuthService;
    }

    private static class RESTInterceptor implements Interceptor {

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            Buffer buffer = new Buffer();
            if (request.body() != null) {
                request.body().writeTo(buffer);
            }
            Log.d("HTTP Request", "Request to " + request.url().toString()
                    + "\n" + request.headers().toString()
                    + "\n" + buffer.readUtf8());
            long t1 = System.nanoTime();
            Response response = chain.proceed(request);
            long t2 = System.nanoTime();

            String msg = response.body().string();
            msg = msg.replace("\r", ""); // Note: Messages with '\r' not displayed correctly in logcat

            Log.d("HTTP Response", String.format("Response from %s in %.1fms%n\n%s",
                    response.request().url().toString(), (t2 - t1) / 1e6d, msg));

            Log.d("HTTP Response", "Response code = " + response.code());

            return response.newBuilder()
                    .body(ResponseBody.create(response.body().contentType(), msg))
                    .build();
        }
    }
    }

Ваш класс MyLogin будет выглядеть примерно так:

public class MuLogin {
/*timeout values in seconds*/
    private static final int CONNECTION_TIMEOUT = 10;
    private static final int WRITE_TIMEOUT = 10;
    private static final int READ_TIMEOUT = 10;

    allApi = all_api;

    OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new RESTInterceptor())
        .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
        .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
        .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
        .build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://us-central1-gmx-notification.cloudfunctions.net/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();

    all_api =retrofit.create(allApi.class);

    public void getUserDetails(String userName, String passWord) {
        Call<User> call = all_api.getUserDetails(userName, passWord);
        call.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                if (!response.isSuccessful()) {
                    Log.d(response.body());
                } else {
                    User user = response.body();
                    String content = "";
                    content += "Name: " + user.getName() + "\n";
                    content += "Email: " + user.getEmail() + "\n";
                    content += "Customer ID: " + user.getCustomerId() + "\n";
                    content += "Phone: " + user.getPhone() + "\n";
                    Log.d(content);
                }
            });
        }
    }
    private static class RESTInterceptor implements Interceptor {

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            Buffer buffer = new Buffer();
            if (request.body() != null) {
                request.body().writeTo(buffer);
            }
            Log.d("HTTP Request", "Request to " + request.url().toString()
                    + "\n" + request.headers().toString()
                    + "\n" + buffer.readUtf8());
            long t1 = System.nanoTime();
            Response response = chain.proceed(request);
            long t2 = System.nanoTime();

            String msg = response.body().string();
            msg = msg.replace("\r", ""); // Note: Messages with '\r' not displayed correctly in logcat

            Log.d("HTTP Response", String.format("Response from %s in %.1fms%n\n%s",
                    response.request().url().toString(), (t2 - t1) / 1e6d, msg));

            Log.d("HTTP Response", "Response code = " + response.code());

            return response.newBuilder()
                    .body(ResponseBody.create(response.body().contentType(), msg))
                    .build();
        }
    }
}
...