Модернизация не доставляет Java-объект в качестве параметров POST на бэкэнд PHP из Android - PullRequest
0 голосов
/ 23 октября 2018

Используя Retrofit, я хочу POST значения Java Object в качестве параметров для PHP-скрипта на стороне сервера.Но, используя приведенный ниже код, я не могу получить какие-либо параметры внутри переменной $_POST.

Вот как я делаю это прямо сейчас.

1) Вот как ясоздайте и получите экземпляр Retrofit

public class RetrofitClient {

    private static Retrofit retrofit;
    private static final String BASE_URL = "http://www.example.com";

    public static Retrofit getInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

2) Модель отправляемых параметров

public class LoginModel {

    @SerializedName("email")
    private String email;

    @SerializedName("password")
    private String password;

    public LoginModel(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public String getEmail() { return email; }
    public String getPassword() { return password; }
}

3) Интерфейс API

public interface RequestAPI {

    @POST("/login")
    Call<ResponseBody> getResponse(@Body LoginModel loginModel) ;
}

4) И вот как я запускаю запрос и ловлю ответ

@Override
public void onClick(View v) {

    LoginModel loginModel = new LoginModel("user@example.com", "123");

    RequestAPI service = RetrofitClient.getInstance().create(RequestAPI.class);

    Call<ResponseBody> call = service.getResponse(loginModel);

    call.enqueue(new Callback<ResponseBody>() {

        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                Log.e("=====", response.body().string());
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.e("=====", "error", t);
        }
    });
}

5) PHP-скрипт в бэкэнде

echo json_encode($_POST);

Теперь каждый раз, когда я выкидываю переменную $ _POST.Это просто дает пустой массив .

Я что-то пропустил.

Почему я не получаю email и пароль как дочерний элемент $ _POST?

1 Ответ

0 голосов
/ 23 октября 2018

Используйте вот так для API метода :

@FormUrlEncoded
@POST("/login")
Call<ResponseBody> getResponse(@Field("email") String email, @Field("password") String password) ;

и звоните так:

@Override
public void onClick(View v) {

LoginModel loginModel = new LoginModel("user@example.com", "123");

RequestAPI service = RetrofitClient.getInstance().create(RequestAPI.class);

Call<ResponseBody> call = service.getResponse(loginModel.getEmail(), loginModel.getPassword());

call.enqueue(new Callback<ResponseBody>() {

    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        try {
            Log.e("=====", response.body().string());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.e("=====", "error", t);
    }
});
}

Редактировать:

Если вы все еще хотите передать пользовательский объект как необработанное тело вызова API, тогда будет изменен код стороны PHP :

Вместо использования

echo json_encode($_POST);

рассмотрите возможность использования

$post_body = file_get_contents('php://input');

, так как этот альтернативный метод предоставляет все необработанное тело запроса как переменную напрямую, а не как объект JSON для кодирования.

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