Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

Editado por manoelps
Inserir dependências

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

Fiz as alterações, mas agora retorna a mensagem em anexo.

Screenshot_2016-09-26-13-48-19.png

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






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

×