Web Service Via HTTP

Pessoal, boa noite.
Primeiramente gostaria de dizer que sou novato e estou tentando aprender Java e Android. Estou assistindo as vídeo aulas do Prof. Neri Neitzke e aprendendo a consumir web service via HTPP.

Fiz toda a parte de codificação igual ao dele na vídeo aula, mas não está funcionando. Colocarei o código e explicarei em qual parte não funciona.

[code]package br.com.videoaulasneri;

import java.util.ArrayList;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import br.com.videoaulasneri.R;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Logar extends Activity {

EditText textUsuario, textSenha;
Button btAcessar;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_logar);
    
    textUsuario=(EditText) findViewById(R.id.editUsuario);
    textSenha=(EditText) findViewById(R.id.editSenha);
    btAcessar=(Button) findViewById(R.id.btAcessar);
    
    btAcessar.setOnClickListener(new View.OnClickListener() {
        
        public void onClick(View v) {
            Log.i("Logar", "Entrou no evento");
            String urlPost = "http://localhost/android/logar.php"; // IP Fixo ao invés do localhost
            //String urlGet = "http://localhost/android/logar.php?usuario="+textUsuario.getText().toString()+"&senha="+textSenha.getText().toString();
            ArrayList<NameValuePair> parametrosPost = new ArrayList<NameValuePair>();
            parametrosPost.add(new BasicNameValuePair("usuario", textUsuario.getText().toString()));
            parametrosPost.add(new BasicNameValuePair("senha", textSenha.getText().toString()));
            String respostaRetornada = null;
            Log.i("Logar", "Vai entrar no try");
            try {
                respostaRetornada = ConexaoHttpClient.executaHttpPost(urlPost, parametrosPost);
                //respostaRetornada = ConexaoHttpClient.executaHttpGet(urlGet);
                String resposta = respostaRetornada.toString();
                Log.i("Logar", "Resposta = "+resposta);
                resposta = resposta.replaceAll("\\s+", "");
                if (resposta.equals("1"))
                    mensagemExibir("Login", "Usuario Válido PARABÉNS ");
                else
                    mensagemExibir("Login", "Usuario Inválido ????");
            }
            catch (Exception erro)
            {
                Log.i("Erro", "Erro = "+erro);
                Toast.makeText(Logar.this, "Erro: "+erro, Toast.LENGTH_LONG).show();
            }
            
        }
    });
}

    public void mensagemExibir(String titulo, String texto)
       {
            AlertDialog.Builder mensagem = new AlertDialog.Builder(Logar.this);
            mensagem.setTitle(titulo);
            mensagem.setMessage(texto);
            mensagem.setNeutralButton("OK",null);
            mensagem.show();
       }

}
[/code]

Acontece o seguinte…Ele está trazendo a resposta correta na linha abaixo, que é retornar 1 quando digito usuário e senha corretos…

Porém, quando eu utilizo o if para efetuar o comparativo, ele está dando sempre “false”, retornando “Usuário Inválido”.

if (resposta.equals("1")) mensagemExibir("Login", "Usuario Válido PARABÉNS "); else mensagemExibir("Login", "Usuario Inválido ????");

Para auxiliá-los segue abaixo o código PHP:

<?php //$usuario = $_GET['usuario']; //$senha = $_GET['senha']; $usuario = $_POST['usuario']; $senha = $_POST['senha']; $conexao = mysql_connect('localhost','root',''); mysql_select_db('android',$conexao); $sql = "SELECT * FROM usuarios WHERE usuario = '$usuario' and senha = '$senha'"; $resultado = mysql_query($sql) or die ("Erro: ".mysql_error()); if (mysql_num_rows($resultado) > 0) { echo "1"; } else { echo 0; } ?>

Gostaria muito da ajuda de vocês se possível. Caso seja necessário mais alguma informação eu posto.
Lembrando que não coloquei aqui o código da Classe “ConexaoHttpClient”.

Peço desculpas se ficou algo confuso, espero que possam me ajudar.
Obs: no lugar do localhost eu utilizei o IP correto, apenas não postei aqui por questões de segurança…

Obrigado,
Marco Ostan

Altera a url: String urlPost = "http://localhost/android/logar.php";

para: String urlPost = "http://10.0.2.2/android/logar.php";

Porque o emulador do android usa o localhost para um loopback, então para desenvolvimento toda vez que quiser acessar um serviço local usa o ip 10.0.2.2.

[quote=srmachado]Altera a url: String urlPost = "http://localhost/android/logar.php";

para: String urlPost = "http://10.0.2.2/android/logar.php";

Porque o emulador do android usa o localhost para um loopback, então para desenvolvimento toda vez que quiser acessar um serviço local usa o ip 10.0.2.2.

[/quote]

srmachado,

Primeiramente obrigado pela resposta.
Na verdade não seria este o problema, quanto a este ponto eu tenho ciência. Eu apenas defini um IP fixo na minha conexão local e utilizei ele no código, coloquei “localhost” aqui apenas para ilustrar. Se o problema fosse IP, ele avisaria no Logcat como conexão recusada.

Não está exibindo uma mensagem de erro específica, a questão é que no Logcat eu consigo visualizar o “Resultado = 1”, mas quando efetuo a comparação disso para exibir um AlertDialog, ele retorna SEMPRE false.

Poderia me ajudar novamente, por favor?

Muito obrigado,
Marco Ostan


o que tem no "resposta" depois que vc faz o replaceAll ???

o que tem no “resposta” depois que vc faz o replaceAll ???

Posta o que esta sendo exibido no seu logcat

Exportei as linhas de exibição do Logcat, conforme segue abaixo:

09-24 15:40:56.374: I/Logar(364): Entrou no evento
09-24 15:40:56.374: I/Logar(364): Vai entrar no try
09-24 15:40:56.604: I/Logar(364): Resposta = ?1

O estranho é esse “?” antes do “1”, pois na exibição do Logcat sem exportar, ele não aparece o “?”, tentei identificar nos códigos se tem o “?” em algum ponto a mais e não tem.

Bom, de qualquer forma imagine que exibiu as linhas acima sem o “?”, só na hora de exportar que isso apareceu.

Como a Resposta é = “1”…
Deveria então funcionar o código:

if (resposta.equals("1")) mensagemExibir("Login", "Usuario Válido PARABÉNS "); else mensagemExibir("Login", "Usuario Inválido ????");

Não consigo entender pq ele dá sempre false =/

[quote=aechiara]resposta = resposta.replaceAll("\\s+", "");

o que tem no “resposta” depois que vc faz o replaceAll ???
[/quote]

Desculpe, mas não sei responder sua pergunta direito.
Segundo a aula do Prof. Neri, isso seria para evitar algum tipo de bug.

Obrigado.

Marco

roda em modo de debug, e olha lá no Inspect ou coloca um watch ou qualquer coisa e vai acompanhando o valor em “resposta” até chegar ao seu if

Após a linha:

Eu coloquei um:

E não exibiu nada além da resposta.

Está retornando Resposta = “1”, mas quando faço a comparação para exibir o alerta

if (resposta.equals("1")) mensagemExibir("Login", "Usuario Válido PARABÉNS "); else mensagemExibir("Login", "Usuario Inválido ????");

Exibe SEMPRE usuário inválido e não consigo entender o porque…

[quote=marcoostan]Após a linha:

Eu coloquei um:

E não exibiu nada além da resposta.

Está retornando Resposta = “1”, mas quando faço a comparação para exibir o alerta

if (resposta.equals("1")) mensagemExibir("Login", "Usuario Válido PARABÉNS "); else mensagemExibir("Login", "Usuario Inválido ????");

Exibe SEMPRE usuário inválido e não consigo entender o porque…[/quote]

Parece problema com o escopo do usuário. Você vai ter que colocar um breakpoint e ir acompanhando usuario para ver o que acontece com ele até o memento que não exite nada dentro dele.

foi o que eu quis dizer quando disse para rodar em modo debug

faz o seguinte também troca a linha:

por

provavelmente tem um espaço ou algum outro caractere junto com o número 1 da resposta, o que faz com que o seu if não seja verdadeiro

outra coisa, para comparar números seria mais interessante converter para número mesmo, mais ou menos assim:

int codResposta = -1;
try
{
    codResposta = Integer.parseInt(resposta);
}
catch (NumberFormatException nfe)
{
   Log.w("Logar", "Erro ao tentar converter o código para número: " + nfe);
}

// usa o codResposta para o seu IF

depois nos diz qual foi o resultado

Boa noite!

  1. Use “1”.equals(variavel). É mais seguro contra qualquer tipo de erro;

  2. Converter para integer vai gerar muito código, tratar excessão etc. usa “1”.equals(variavel.trim())

  3. Se nada acima der certo, por acaso quando tu fala que o resultado = “1” tu que tah colocando essas " né?

Valeu

[quote=aechiara]foi o que eu quis dizer quando disse para rodar em modo debug

faz o seguinte também troca a linha:

por

provavelmente tem um espaço ou algum outro caractere junto com o número 1 da resposta, o que faz com que o seu if não seja verdadeiro

outra coisa, para comparar números seria mais interessante converter para número mesmo, mais ou menos assim:

int codResposta = -1;
try
{
    codResposta = Integer.parseInt(resposta);
}
catch (NumberFormatException nfe)
{
   Log.w("Logar", "Erro ao tentar converter o código para número: " + nfe);
}

// usa o codResposta para o seu IF

depois nos diz qual foi o resultado[/quote]

Primeiramente MUITO obrigado pela ajuda!
Mas, infelizmente não funcionou.
Inclusive gerou Exception na conversão para integer: “unable to parse ‘1’ as integer”

Tem alguma outra ideia?

[quote=leo.alvesneuwald]Boa noite!

  1. Use “1”.equals(variavel). É mais seguro contra qualquer tipo de erro;

  2. Converter para integer vai gerar muito código, tratar excessão etc. usa “1”.equals(variavel.trim())

  3. Se nada acima der certo, por acaso quando tu fala que o resultado = “1” tu que tah colocando essas " né?

Valeu[/quote]

Segui seus passos também e infelizmente não funcionou! :frowning:

Quando falo do Resultado = "1"
É devido ao código do PHP.
A classe java nada mais lê o que imprime no brownser (String) e retorna a resposta que é “1”, ele está trazendo “Resposta = 1” no Logcat de forma correta, porém ao efetuar o if para exibir o alerta ele dá SEMPRE false.

Olhe o código PHP para entender.

[code]<?php

//$usuario = $_GET[‘usuario’];
//$senha = $_GET[‘senha’];

$usuario = $_POST[‘usuario’];
$senha = $_POST[‘senha’];

$conexao = mysql_connect(‘localhost’,‘root’,’’);
mysql_select_db(‘android’,$conexao);
$sql = “SELECT * FROM usuarios WHERE usuario = ‘$usuario’ and senha = ‘$senha’”;
$resultado = mysql_query($sql) or die ("Erro: ".mysql_error());
if (mysql_num_rows($resultado) > 0) {
echo “1”;
} else {
echo 0;
}

?>[/code]

É possível eu passar o projeto para alguém e analisar, por favor?
Não sei mais o que fazer :frowning:

Obrigado a todos pela atenção e ajuda!

[quote=marcoostan]

Primeiramente MUITO obrigado pela ajuda!
Mas, infelizmente não funcionou.
Inclusive gerou Exception na conversão para integer: “unable to parse ‘1’ as integer”

Tem alguma outra ideia?[/quote]

eu esperava pela exception, o retorno não é apenas “1” como você espera tem mais alguma coisa.
Coloca um breakpoint aí nessa linha e olha pelo inspect o que tem lá

[quote=marcoostan]
09-24 15:40:56.604: I/Logar(364): Resposta = ?1
O estranho é esse “?” antes do “1”, pois na exibição do Logcat sem exportar, ele não aparece o “?”, [/quote]

O pessoal está alertando que pode ter algo além do “1” , e isso torna mais suspeito ainda… eu acho que tem algum código de caractere não-legível por aí, e a ferramenta na hora de exportar o log colocou (?)

Siga aquela dica de imprimir a resposta entre []s
Depois tente imprimir o tamanho da string (resposta.length()) para ver se realmente só existe o caractere 1
E aí finalmente (uma idéia maluca, mas não podemos descartar nada) pode ser que isso seja alguma coisa que parece 1 mas não é… imprima o código do caractere para ver qual é

Bem é como gomesrod disse.

Na linha

Que deveria apagar espaços, aparentemente não está funcionando ou tem algum outro caracter lá. Talvez quando vc vio o ?1 a ‘?’ deve ser algum caracter que o Logcat não reconheceu.
A prova disso é que o codResposta = Integer.parseInt(resposta); Não funcionou (“unable to parse ‘1’ as integer”).

OBS.: Ainda não sei nada de android. Substitui os sysout, pelo comando especifico ai. Pode se na saida do Logcat ai mesmo

//Por hora, comente esta linha 
//resposta = resposta.replaceAll("\\s+", ""); 
//Verifique quantos caracteres tem a resposta
System.out.println(resposta.length());

for(int i = 0; i < resposta.length(); i++){
//imprima o codigo ascii dos caracter e veja qualquer coisa estranha que sair
     System.out.println((int)resposta.charAt(0));
}

Poste aqui o resultado. :smiley: Sei que é um saco, mas não desista. :D. Ahhh, vá de pouco em pouco.
Primeiro, tire o if e faça o login direto.
Segundo, faça resposta = 1; e novamente, deverá fazer login normalmente.
Terceiro, o que já está fazendo.

Vou ler os posts de todos e já retorno com respostas.

Bom, vamos lá…
Tirei o if e coloquei para exibir a mensagem e funcionou perfeitamente.
Coloquei if (resposta == 1) e não funcionou.

Utilizei também Log.i("Logar", "Resposta = [" + resposta + "]");

Não desistirei :smiley:

Segue abaixo as informações do Log.

09-26 21:15:46.238: I/logar(533): entrou no evento
09-26 21:15:46.238: I/logar(533): vai entrar no try
09-26 21:15:46.538: I/Logar(533): Resposta = [?1
09-26 21:15:46.538: I/Logar(533): ]
09-26 21:15:46.588: I/System.out(533): 3
09-26 21:15:46.588: I/System.out(533): 65279
09-26 21:15:46.588: I/System.out(533): 65279
09-26 21:15:46.588: I/System.out(533): 65279

Alguém agora pode me dar um norte para resolver?
Realmente temos um caractere a mais, agora onde? Eu não tenho a menor ideia…

eis o seu problema aqui

09-26 21:15:46.538: I/Logar(533): Resposta = [?1 09-26 21:15:46.538: I/Logar(533): ]

tem um char antes do “1” e um char de nova linha depois