WedX - журнал о программировании и компьютерных науках

Ошибка в коде запроса Get & Post в модификации 2

У меня есть API, Api = "https://retailapi.airtechsolutions.pk/api/login/[email protected]/admin/"

Я новичок в Retrofit2, если кто-нибудь может помочь мне с моим кодом

У меня есть ошибка при выполнении запроса GET и POST

При использовании Get Api: имя пользователя и пароль недействительны

При использовании Post Api: я получаю код ошибки 404

Активность входа:

private JsonPlaceHolderApi jsonPlaceHolderApi;

protected void onCreate(Bundle savedInstanceState)
    {   super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        Retrofit retrofit = new Retrofit.Builder().baseUrl("https://retailapi.airtechsolutions.pk/api/login/[email protected]/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);

        getLogin();
        createPost();
    }

private void getLogin()
    {
        Call<Login> call = jsonPlaceHolderApi.getLogin();

        call.enqueue(new Callback<Login>()
        {
            @Override
            public void onResponse(Call<Login> call, Response<Login> response)
            {
                if (!response.isSuccessful())
                {
                    Log.i("Code: " , String.valueOf(response.code()));
                    return;
                }

                Login logins = response.body();


                    String content = "";
                    content += "UserName: " + logins.getUsername() + "\n";
                    content += "Password: " + logins.getPassword() + "\n";
                    content += "Status: " + logins.getStatus() + "\n";
                    content += "Description: " + logins.getDescription() + "\n\n";

                    Log.i("Read me", content);
            }

            @Override
            public void onFailure(Call<Login> call, Throwable t)
            {
                Log.i("Error", t.getMessage());
            }

        });
    }

    private void createPost() {
        Login login = new Login("New Name", "New Password");

        Call<Login> call = jsonPlaceHolderApi.createPost(login);

        call.enqueue(new Callback<Login>() {
            @Override
            public void onResponse(Call<Login> call, Response<Login> response) {

                if (!response.isSuccessful())
                {
                    Log.i("Code: " , String.valueOf(response.code()));
                    return;
                }

                Login loginResponse = response.body();

                String content = "";
                content += "Code: " + response.code() + "\n";
                content += "UserName: " + loginResponse.getUsername() + "\n";
                content += "Password: " + loginResponse.getPassword() + "\n";
                content += "Status: " + loginResponse.getStatus() + "\n";
                content += "Description: " + loginResponse.getDescription() + "\n\n";

                Log.i("Read me",content);
            }

            @Override
            public void onFailure(Call<Login> call, Throwable t) {
                Log.i("Failure", t.getMessage());
            }
        });
    }

Класс входа:

String username;
    String password;
    int Status;
    String Description;

    public Login(String username, String password)
    {
        this.username = username;
        this.password = password;
    }

    public String getUsername()
    {
        return username;
    }

    public String getPassword()
    {
        return password;
    }

    public int getStatus()
    {
        return Status;
    }

    public String getDescription()
    {
        return Description;
    }

И класс интерфейса под названием JsonPlaceHolderApi

public interface JsonPlaceHolderApi
{
    @GET("admin")
    Call<Login> getLogin();

    @POST("admin")
    Call<Login> createPost(@Body Login login);
}
07.09.2019

  • сервер на самом деле отправляет HTTP 404, так что это работает, как и предполагалось. 07.09.2019

Ответы:


1

Начиная с проблемы GET, вы получаете поля (имя пользователя и пароль), равные нулю, потому что они не находятся на верхнем уровне вашего JSON, поэтому, чтобы исправить проблему GET, вам необходимо создать следующий класс:

Вход в систему

import com.google.gson.annotations.SerializedName;

public class LoginResponse {
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @SerializedName("Users")
    User user;
    @SerializedName("Status") int status;
    @SerializedName("Description") String description;
}

Добавьте пользовательский класс, в котором будут храниться все данные пользователя:

Пользователь

public class User {

     public User(String username, String password) {
          this.username = username;
          this.password = password;
     }

     public String getClientno() {
          return clientno;
     }

     public void setClientno(String clientno) {
          this.clientno = clientno;
     }

     public String getCompanyno() {
          return companyno;
     }

     public void setCompanyno(String companyno) {
          this.companyno = companyno;
     }

     public String getUserno() {
          return userno;
     }

     public void setUserno(String userno) {
          this.userno = userno;
     }

     public String getUsername() {
          return username;
     }

     public void setUsername(String username) {
          this.username = username;
     }

     public String getPassword() {
          return password;
     }

     public void setPassword(String password) {
          this.password = password;
     }

     public int getRowno() {
          return rowno;
     }

     public void setRowno(int rowno) {
          this.rowno = rowno;
     }

     String clientno;
     String companyno;
     String userno;
     String username;
     String password;
     int rowno;
}

Затем обновите интерфейс JsonPlaceHolderApi, чтобы он возвращал Call<LoginResponse> вместо Call<Login>:

@GET("admin")
Call<LoginResponse> getLogin();

@POST("admin")
Call<LoginResponse> createPost(@Body User login);

И еще одно: замените оба getLogin() и createPost() на следующие:

private void getLogin() {
    Call<LoginResponse> call = jsonPlaceHolderApi.getLogin();

    call.enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
            if (!response.isSuccessful()) {
                https://retailapi.airtechsolutions.pk/api/login/[email protected]/

                Log.i("Code: ", String.valueOf(response.code()));
                return;
            }

            LoginResponse loginResponse = response.body();


            String content = "";
            content += "UserName: " + loginResponse.user.getUsername() + "\n";
            content += "Password: " + loginResponse.user.getPassword() + "\n";
            content += "Status: " + loginResponse.getStatus() + "\n";
            content += "Description: " + loginResponse.getDescription() + "\n\n";

            Log.i("Read me", content);
        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {
            Log.i("Error", t.getMessage());
        }

    });
}

private void createPost() {
    User login = new User("New Name", "New Password");

    Call<LoginResponse> call = jsonPlaceHolderApi.createPost(login);

    call.enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {

            if (!response.isSuccessful()) {
                Log.i("Code: ", String.valueOf(response.code()));
                return;
            }

            LoginResponse loginResponse = response.body();

            String content = "";
            content += "Code: " + response.code() + "\n";
            content += "UserName: " + loginResponse.user.getUsername() + "\n";
            content += "Password: " + loginResponse.user.getPassword() + "\n";
            content += "Status: " + loginResponse.getStatus() + "\n";
            content += "Description: " + loginResponse.getDescription() + "\n\n";

            Log.i("Read me", content);
        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {
            Log.i("Failure", t.getMessage());
        }
    });
}

Что касается проблемы POST, 405 (метод не разрешен), похоже, что действие «admin» не поддерживает метод POST.

07.09.2019
  • Коды абсолютно в порядке :) единственная проблема в том, что возвращенные пользователи - это пользователи: com.airtechsolutions.logixtraders.Login@84bcac5 Но я хочу ПОЛУЧИТЬ все поля пользователей, такие как имя пользователя и пароль 08.09.2019
  • @HamadMalik, я обновил свой ответ, теперь вы можете получить данные всех своих пользователей из ответа. 08.09.2019
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]