2016-09-27 2 views
1

Я новичок в программировании на Android и работаю с Retrofit.Как получить список объектов с post request to retrofit 2.1.0 с помощью android

Я вижу много примеров для модернизации библиотеки, делая GET запросов, передавая параметры и перенося все объекты на страницу в PHP. Возможно, сделать то же самое с POST? Я хочу привести все данные (JSON объектов) из моего webservice, передавая параметры через POST, но я не могу выполнить реализацию.

У кого-нибудь есть или есть пример, чтобы помочь мне?

Изучая документацию и рассматривая примеры здесь, в stackoverflow, я мог бы сделать пример ниже, но только возвращает первый объект.

Зависимости:

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 

MainActivity (внутри кнопки):

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://192.168.101.36/json/") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    ApiService apiService = retrofit.create(ApiService.class); 

    Call<User> call = apiService.validateUser(inputEmail.getText().toString(), inputSenha.getText().toString()); 
    call.enqueue(new Callback<User>() { 
     @Override 
     public void onResponse(Call<User> call, Response<User> response) { 
      //Verifica se houve a conexão com sucesso ao webservice 
      if (!response.isSuccessful()) { 
       textView.setText("ERROR onResponde: " + response.code()); 
      } else { 
       //requisição retona os dados com sucesso 
       String email = response.body().getEmail(); 
       String senha = response.body().getPassword(); 
       textView.append("email: " + email + " - password: " + senha + "\n"); 
      } 
     } 

     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
      t.printStackTrace(); 
      textView.setText(t.getMessage()); 
     } 

    }); 

Интерфейс:

public interface ApiService { 
    @FormUrlEncoded 
    @POST("index.php") 
    Call<User> validateUser(
     @Field("username") String username, 
     @Field("password") String password 
    ); 
} 

Класс пользователя:

public class User { 
private String username, email, password; 

public String getUsername(){ 
    return this.username; 
} 

public String getPassword(){ 
    return this.password; 
} 

public String getEmail(){ 
    return this.email; 
} 
} 

Index.php:

$email = $_POST['username']; 
$senha = $_POST['password']; 

if ($email == "[email protected]") { 

    echo ' 
    { 
    "email":"' . $email . '", 
    "password":"' . $senha . '" 
    }, 
    { 
    "email":"[email protected]", 
    "password":"654321" 
    }, 
    { 
    "email":"[email protected]", 
    "password":"123456" 
    } 
    '; 

} else { 

    echo ' 
    { 
    "email":"[email protected]", 
    "password":"987654" 
    }, 
    { 
    "email":"[email protected]", 
    "password":"987654" 
    }, 
    { 
    "email":"[email protected]", 
    "password":"987654" 
    } 
    '; 
} 

Если я использую как массив объектов ocurred ошибка в приложении:

[{ 
"email":"[email protected]", 
"password":"123456" 
}, 
{ 
"email":"[email protected]", 
"password":"123456" 
}] 

ответ

0

Если вы ожидаете несколько возвращает вам нужно указать, что вызов возвращает список.

@FormUrlEncoded 
    @POST("index.php") 
    Call<User> validateUser(
     @Field("username") String username, 
     @Field("password") String password 
    ); 

должен быть

@FormUrlEncoded 
    @POST("index.php") 
    Call<List<User>> validateUser(
     @Field("username") String username, 
     @Field("password") String password 
    ); 

Затем в обратном вызове response.body() даст вам список пользовательских объектов можно перебирать.

+0

Бен, дорогой мой, очень очень спасибо! Он работал на 100%, страдал неделю. –

0

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

 Call<List<User>> call = apiService.validateUser(inputEmail.getText().toString(), inputSenha.getText().toString()); 
     call.enqueue(new Callback<java.util.List<User>>() { 
      @Override 
      public void onResponse(Call<List<User>> call, Response<List<User>> response) { 
       //Verifica se houve a conexão com sucesso ao webservice 
       if (!response.isSuccessful()) { 
        textView.setText("ERROR onResponde: " + response.code()); 
       } else { 

        try { 

         //pegando os dados 
         List<User> listUsers = response.body(); 

         //retona os dados 
         for (User c : listUsers) { 
          textView.append("Email: " + c.getEmail() + " - " + "Senha: " + c.getPassword() + "\n"); 
         } 

        } catch (Exception e) { 
         e.printStackTrace(); 
         textView.setText("ERROR:" + e.getMessage()); 
        } 
       } 
      } 
Смежные вопросы