Ir ao conteúdo
  • Cadastre-se

Post request com retrofit + android


manoelps

Posts recomendados

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":"[email protected]",
      "password":"123456"
    }
';

 

Att.

Manoel Pereira dos Santos

Link para o comentário
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":"[email protected]",
      "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');

 

Link para o comentário
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);

 

Link para o comentário
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?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!