Ir ao conteúdo
  • Cadastre-se
manoelps

Post request com retrofit + android

Recommended Posts

Olá pessoal, estou estudando android, e estou tentando usar a biblioteca retrofit com android. Após ler a documentação consegui fazer envio de dados de um formulario via POST para uma página escrita em php, e receber o retorno (em formato JSON), porém não consigo receber todos os dados, recebo só o primeiro, e eu gostaria de receber toda a lista de usuários que eu colocar na pagina, segue meu codigo abaixo:

 

Dependências:

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

MainActivity (dentro de um botão):

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 + " - senha: " + senha + "\n");
                        }
                    }

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

                });

Interface:

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

Classe User:

public class User {
    private int id;
    private String error, error_msg, username, email, password;

    public String getError(){
        return this.error;
    }

    public String getError_msg(){
        return this.error_msg;
    }

    public int getId(){
        return this.id;
    }

    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'];

echo '
    {
      "email":"'.$email.'",
      "password":"'.$senha.'"
    },
    {
      "email":"'.$email.'",
      "password":"'.$senha.'"
    },
    {
      "email":"joselito@joselito.com",
      "password":"123456"
    }
';

 

Att.

Manoel Pereira dos Santos

Compartilhar este post


Link para o post
Compartilhar em outros sites

O json de resposta está errado. Para um array de objetos utilize

echo '
    [{
      "email":"'.$email.'",
      "password":"'.$senha.'"
    },
    {
      "email":"'.$email.'",
      "password":"'.$senha.'"
    },
    {
      "email":"joselito@joselito.com",
      "password":"123456"
    }]
';

Um outro detalhe. Não sei se você colocou isso no código, mas é importante mudar o content-type da sua resposta em php para 'application/json', pois senão o android pode começar a tratar como 'text/plain' e não montar corretamente o objeto.

header('Content-Type: application/json');

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sorry ... vi isso e esqueci de mencionar.

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

Seu código espera por um único objeto. O certo seria ele esperar por uma lista de objetos, como 'Call<List<User>>' ... e dentro você itera a lista ... algo como 

@POST("index.php")
Call<List<User>> groupList(@Body List<User> users);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou testar aqui e retono.

Obrigado pela atenção.

adicionado 7 minutos depois
11 minutos atrás, psykotico disse:

@POST("index.php") Call<List<User>> groupList(@Body List<User> users);

 Em um detalhe, se eu faço isso como ficaria a passagem dos parametros?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido!

 

[ANTES]:

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

 

[DEPOIS]:

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

 

Então no callback response.body()  irá dar-lhe uma lista de objetos Usuário, depois só interagir com a lista.


Link da solução completa: http://stackoverflow.com/questions/39724751/how-get-list-of-objects-with-post-request-to-retrofit-2-1-0-with-android/39725105#39725105

adicionado 5 minutos depois

.

Não consigo fechar o post!  :(
Algum moderador porde fazer esta gentileza, o caso foi resolvido?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×