Помогите решить ошибку с interface android

233
04 сентября 2018, 21:30

У меня есть приложение в котором я пытаюсь реализовать функцию логина при помощи логина и пароля, и вот у меня возникла ошибка

error: method savePost in interface APIService cannot be applied to given types;
required: Post
found: String,String
reason: actual and formal argument lists differ in length

метод savepost в интерфейсе:

@POST("v1/login/{login}{password}")
Call<Post> savePost(@Body Post body);

а потом этот-же метод вызывается в mainactivity:

mAPIService.savePost(login, password).enqueue(new Callback<Post>() {
            @Override
            public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) {
                if(response.isSuccessful()) {
                    showResponse(response.body().toString());
                    Toast.makeText(LoginActivity.this,"post submitted to API.",Toast.LENGTH_LONG).show();
                }
            }
            @Override
            public void onFailure(Call<Post> call, Throwable t) {
                Toast.makeText(LoginActivity.this,"Unable to submit post to API.",Toast.LENGTH_LONG).show();
            }
        });

я никак не могу понять в чем проблема, если смотреть по ошибке именно то получается что у меня необходимо post а нашло два string. У меня на сервере ждут просто json который я должен вытащить с двух полей для ввода. И я не могу понять в чем проблема, у меня вообще не посылается запрос на сервер.Также у меня есть класс для отправки сериализации данных перед отправкой на сервер:

import com.google.gson.annotations.SerializedName;
public class Post {
    @SerializedName("login")
    private String login;
    @SerializedName("password")
    private String password;
    public Post(String login, String password) {
        this.login = login;
        this.password = password;
    }
    public String getLogin() {
        return login;
    }
    public void setLogin (String login) {
        this.login = login;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "Post{" +
                "User login ='" + login + '\'' +
                ", password ='" + password + '}';
    }
}

Если кто-то знает в чем проблема буду благодарен за помощь.

Answer 1

Ваш метод: Call<Post> savePost(@Body Post body), — это значит, что он принимает один входной параметр. А вы передаёте два: savePost(login, password).

Вам стоит поступить так:

Создайте класс, который будет выступать телом для запроса после его сериализации:

class LoginBody {
    private String login, password;
    // геттеры, сеттеры, конструкторы не забудьте
} 

И затем вызываете:

mAPIService.savePost(new LoginBody(login, password))

Ваш объект будет сериализован в следующий json:

{ "login": "значение переменной login", "password": "значение переменной password" }

Но для автоматической де/сериализации не забудьте в билдере при инициализации вашего объекта retrofit указать GsonConverterFactory.

И также, конечно же, сигнатуру метода тоже придётся подправить:

@POST("v1/login/{login}{password}")
Call<Post> savePost(@Body LoginBody body);

И зачем вы используете /{login}{password}? Это будет заменено в итоге на /user1234password1234 при логине user1234 и пароле password1234, каким образом бэкенд определит, где закончился логин и начался пароль?

И тем более, для того, чтобы внутри @POST("вот здесь") что-то заменялось, необходимо передать дополнительные входные параметры с аннотацией @Path.

Более развёрнутый пример (в комментариях неудобно, да и не стоит отвечать).

Вот такой вот метод:

@POST("/v1/login/{parameter_0}/{parameter_1}")
Call<SomeResponse> auth(@Body LoginBody body, @Path("parameter_0") p0, @Path("parameter_1") p1);

Нужно вызывать так:

String a = "qwerty";
String b = "abcdef";
api.auth(new LoginBody(login, password), a, b);

В итоге будет отправлен запрос по такому адресу:

https://адрес_сервера/v1/login/qwerty/abcdef

С таким телом:

{ "login": "значение login", "password": "значение password" }

Адрес сервера, очевидно, передаете при инициализации билдера retrofit.

READ ALSO
Java. Spring. Многопользовательский режим

Java. Spring. Многопользовательский режим

Подскажите, что прочитать, чтоб понять как Spring работает в многопользовательском режиме?

209
Сравнить переменные в объектах JAVA

Сравнить переменные в объектах JAVA

Существуют шесть объектов - кубов у которых есть объем(сторона задана в ручную)Как мне отсортировать объемы кубов и вывести информацию в табличном...

225
Не отправляются файлы на сервер JSF

Не отправляются файлы на сервер JSF

Есть JSF страница (создание статьи) те

187
Как проверить содержимое строчки

Как проверить содержимое строчки

Есть строчка: String msg = "test";

187