Дооснащение: onFailure: ожидалось BEGIN_OBJECT, но было BEGIN_ARRAY по пути $ - PullRequest
0 голосов
/ 03 июля 2018

Я пишу приложение для Android, используя модифицированные и API-интерфейсы Laravel. Моя проблема: я хочу вернуть пользователей с API, это прекрасно работает, как это выглядит в chrome: inspector, но logcat показывает: onFailure: ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY по пути $

мой интерфейс:

public interface ApiService {

    @POST("register")
    @FormUrlEncoded
    Call<AccessToken> register(@Field("name") String name, @Field("email") String email, @Field("password") String password);

    @POST("login")
    @FormUrlEncoded
    Call<AccessToken> login(@Field("username") String username, @Field("password") String password);

    @GET("users")
    Call<UserResponse> users();

}

Мой класс ответа

import java.util.List;

public class UserResponse {

    List<User> data;

    public List<User> getData() {
        return data;
    }

Мой пользователь Модель

public class User {

    int id;
    String name;
    String email;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

И мой вызов API:

@OnClick(R.id.btn_get_user)
    void getUsers() {
        call = service.users();
        call.enqueue(new Callback<UserResponse>() {
            @Override
            public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {
                Log.w(TAG, "onResponse: " + response);

                if (response.isSuccessful()) {
                    username.setText(response.body().getData().get(0).getName());
                } else {
                    startActivity(new Intent(GameActivity.this, LoginActivity.class));
                    finish();
                    tokenManager.deleteToken();
                }

            }

            @Override
            public void onFailure(Call<UserResponse> call, Throwable t) {
                Log.w(TAG, "onFailure: " + t.getMessage());
            }
        });

    }

Надеюсь, вы сможете мне помочь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

используйте объявление "Список", показанное ниже: -

**Api interface**

открытый интерфейс ApiService {

@POST("register")
@FormUrlEncoded
Call<List<AccessToken>> register(@Field("name") String name, @Field("email") String email, @Field("password") String password);

@POST("login")
@FormUrlEncoded
Call<List<AccessToken>> login(@Field("username") String username, @Field("password") String password);

@GET("users")
Call<List<UserResponse>> users();

}

вызов API:

@OnClick(R.id.btn_get_user)
    void getUsers() {
        call = service.users();
        call.enqueue(new Callback<List<UserResponse>>() {
            @Override
            public void onResponse(Call<List<UserResponse>> call, Response<List<UserResponse>> response) {
                Log.w(TAG, "onResponse: " + response);

                if (response.isSuccessful()) {
                    username.setText(response.body().getData().get(0).getName());
                } else {
                    startActivity(new Intent(GameActivity.this, LoginActivity.class));
                    finish();
                    tokenManager.deleteToken();
                }

            }

            @Override
            public void onFailure(Call<List<UserResponse>> call, Throwable t) {
                Log.w(TAG, "onFailure: " + t.getMessage());
            }
        });

    }
0 голосов
/ 03 июля 2018

Вы должны проверить JSON, который вы отправляете с вашего API бэкэнда. Возможно, вы отправляете объект из вашего серверного API для вызова @GET("users") API, но вы хотите проанализировать его ответ как List<User>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...