Android Release APK не анализирует JSON из веб-службы с помощью SSL с помощью Retrofit2 - PullRequest
0 голосов
/ 31 января 2019

Я создал веб-сервис REST с использованием SSL, т. Е. https://api.bmcstudios.org

Конечная точка, к которой я пытаюсь обратиться:

GET https://api.bmcstudios.org/member

Ожидаемый ответ

{
    "members": [
        {
            "memberId": "5c4e448d46e0fb0001656a46",
            "email": "email@gmail.com",
            "displayName": "username",
            "firstName": "First",
            "lastName": "Last",
            "address": {
                "street_1": "Street Address 1",
                "street_2": "",
                "city": "City",
                "state": "ST",
                "zipCode": 55555,
                "country": "US"
            },
            "phone": "123-456-7890",
            "roles": [
                {
                    "id": "5c47fe53473d4ad05bdf99f5",
                    "role": "ROLE_MEMBER"
                }
            ]
        }
    ]
}

Я получаю этот ответ, когда использую Postman и когда запускаю эмулятор Android Pixel 2 XL API 28.

При развертывании моей сборки через комплект приложений Android в последней версии Android Studio 3.3в магазине Google Play через Internal Test Track и Production Track я могу подключиться к своему веб-сервису.Но ответ, который я получил, пуст!

Вот что мои журналы показывают как ответ:

I/System.out: appWebservice.getMemberDetails(): {"members":[{},{},{}]}

Структура присутствует, но объект Member в массиве не отображается.Вот мой код Java ниже:

Интерфейс Retrofit2

public interface AppWebservice {
    String API_URL = "https://api.bmcstudios.org/";

    Gson gson = new GsonBuilder()
                        .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                        .create();

    Retrofit RETROFIT = new Retrofit.Builder()
                                .baseUrl(API_URL)
                                .addConverterFactory(GsonConverterFactory.create(gson))
                                .build();

    // MEMBER
    @GET("member")
    Call<MemberResponse> getMemberDetails(
            @HeaderMap Map<String, String> headers);
}

Объект ответа члена

@Getter
@Setter
@NoArgsConstructor
public class MemberResponse implements Serializable {
    @SerializedName("members")
    @Expose
    private List<Member> members;

    @Getter
    @Setter
    @NoArgsConstructor
    public class Member implements Serializable {
        @SerializedName("memberId")
        @Expose
        private String memberId;
        @SerializedName("email")
        @Expose
        private String email;
        @SerializedName("displayName")
        @Expose
        private String displayName;
        @SerializedName("firstName")
        @Expose
        private String firstName;
        @SerializedName("lastName")
        @Expose
        private String lastName;
        @SerializedName("picture")
        @Expose
        private String picture;
        @SerializedName("address")
        @Expose
        private Address address;
        @SerializedName("phone")
        @Expose
        private String phone;
        @SerializedName("roles")
        @Expose
        private List<Role> roles;

        @Getter
        @Setter
        @NoArgsConstructor
        public class Address implements Serializable {
            @SerializedName("street_1")
            @Expose
            private String street1;
            @SerializedName("street_2")
            @Expose
            private String street2;
            @SerializedName("city")
            @Expose
            private String city;
            @SerializedName("state")
            @Expose
            private String state;
            @SerializedName("zipCode")
            @Expose
            private Integer zipCode;
            @SerializedName("country")
            @Expose
            private String country;
        }

        @Getter
        @Setter
        @NoArgsConstructor
        public class Role implements Serializable {
            @SerializedName("id")
            @Expose
            private String id;
            @SerializedName("role")
            @Expose
            private String role;
        }
    }
}

Созданиесервисный вызов в приложении:

public void getMemberDetails() {
        if (getIdToken().getValue() == null) {
            updateIdToken();
        } else {
            Map<String, String> headers = new HashMap<>();
            headers.put("Content-type", "application/json");
            headers.put(FIREBASE_AUTH_HEADER, getIdToken().getValue());

            appWebservice.getMemberDetails(headers)
                    .enqueue(new Callback<MemberResponse>() {
                        @Override
                        public void onResponse(
                                @NonNull Call<MemberResponse> call,
                                @NonNull retrofit2.Response<MemberResponse> response) {
                            if (response.body() != null) {
                                System.out.println("appWebservice.getMemberDetails(): " + new Gson().toJson(response.body()));

                                for (MemberResponse.Member member : response.body().getMembers()) {
                                    MemberEntity memberEntity =
                                            toEntity(new Gson().toJson(member));

                                    if (isNotBlank(memberEntity.getMemberId())) {
                                        repository.storeMemberDetails(memberEntity);
                                    }
                                }
                            }
                        }

                        @Override
                        public void onFailure(
                                @NonNull Call<MemberResponse> call, @NonNull Throwable t) {
                            System.err.println("appWebservice.getMemberDetails(): " + t.getMessage());
                        }
                    });
        }
    }

Я не набираю onFailure вызов, потому что сервисный вызов выполнен успешно.Я получаю ответ json, но, похоже, он не обрабатывается правильно, т. Е. Отсутствуют данные в объектах массива.

Эта проблема возникает только при развертывании моего .apk через магазин Google Play.

Пожалуйста, помогите мне решить эту проблему!Спасибо

1 Ответ

0 голосов
/ 31 января 2019

Мне удалось решить эту проблему, используя объект Gson с именем JsonElement

https://google.github.io/gson/apidocs/com/google/gson/JsonElement.html

Я поменял объект MemberResponse на объект JsonElement, а затем вручнуюпроанализировал мои данные через JsonObject и JsonArray.Отлично сработало.

Вот обновленные файлы.

public interface AppWebservice {
    String API_URL = "https://api.bmcstudios.org/";

    Gson gson = new GsonBuilder()
                        .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                        .create();

    Retrofit RETROFIT = new Retrofit.Builder()
                                .baseUrl(API_URL)
                                .addConverterFactory(GsonConverterFactory.create(gson))
                                .build();

    // MEMBER
    @GET("member")
    Call<JsonElement> getMemberDetails(
            @HeaderMap Map<String, String> headers);
}

public void getMemberDetails() {
    if (getIdToken().getValue() == null) {
        updateIdToken();
    } else {
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-type", "application/json");
        headers.put(FIREBASE_AUTH_HEADER, getIdToken().getValue());

        appWebservice.getMemberDetails(headers)
                .enqueue(new Callback<JsonElement>() {
                    @Override
                    public void onResponse(
                            @NonNull Call<JsonElement> call,
                            @NonNull retrofit2.Response<JsonElement> response) {
                        if (response.body() != null) {
                            System.out.println("appWebservice.putMemberDetails(): " + new Gson().toJson(response.body()));

                            JsonObject jsonObject = response.body().getAsJsonObject();
                            if (jsonObject.has("members")) {
                                JsonArray members = jsonObject.getAsJsonArray("members");
                                for (JsonElement memberElement : members) {
                                    MemberEntity memberEntity =
                                            toEntity(new Gson().toJson(memberElement));

                                    if (isNotBlank(memberEntity.getMemberId())) {
                                        repository.storeMemberDetails(memberEntity);

                                        member.postValue(Member.toMember(memberEntity));
                                    }
                                }
                            }
                        }
                    }

                    @Override
                    public void onFailure(
                            @NonNull Call<JsonElement> call, @NonNull Throwable t) {
                        System.err.println("appWebservice.getMemberDetails(): " + t.getMessage());
                    }
                });
    }
}
...