Web Service Via HTTP

39 respostas
M

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.

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();
           }

}

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

Log.i("Logar", "Resposta = "+resposta);

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:

//$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

39 Respostas

S

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.

M

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.

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

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

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

S

Posta o que esta sendo exibido no seu logcat

M

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 =/

M

aechiara:
resposta = resposta.replaceAll("\\s+", "");

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

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

Obrigado.

A

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

M

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…

J

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…

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.

A

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

L

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

M

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

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?

M
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

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

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.

<?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; 
} 

?>

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

Obrigado a todos pela atenção e ajuda!

A

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?

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á

G

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 “?”,

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 é

T

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.

M

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

M

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…

A

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

T

Não tem nada a ver com seu problema, é só uma observação ‘respostaRetornada’ é uma string assim como 'resposta’
Neste caso vc pode eliminar uma das duas.

String respostaRetornada = null; Log.i("Logar", "Vai entrar no try"); try { respostaRetornada = ConexaoHttpClient.executaHttpPost(urlPost, parametrosPost); //respostaRetornada = ConexaoHttpClient.executaHttpGet(urlGet); String resposta = respostaRetornada.toString();

M

Alguma ideia de como possa resolver?
Eu poderia lhe enviar o projeto para analisar?

Obrigado e abraço!

M

tgcmv:
Não tem nada a ver com seu problema, é só uma observação ‘respostaRetornada’ é uma string assim como 'resposta’
Neste caso vc pode eliminar uma das duas.

String respostaRetornada = null; Log.i("Logar", "Vai entrar no try"); try { respostaRetornada = ConexaoHttpClient.executaHttpPost(urlPost, parametrosPost); //respostaRetornada = ConexaoHttpClient.executaHttpGet(urlGet); String resposta = respostaRetornada.toString();

Já tinha feito isso, eu percebi esse “erro” :slight_smile:

Obrigado!

A

não acho que seja necessário enviar o projeto

olhando para o seu PHP eu vi o seguinte:

if (mysql_num_rows($resultado) > 0) {   
echo "1";   
} else {   
echo 0;   
}

tenta tirar as aspas do echo e ve o que acontece, mais ou menos assim:

if (mysql_num_rows($resultado) > 0) {   
echo 1;   
} else {   
echo 0;   
}
M

Obrigado mais uma vez!

Ainda não funcionou, infelizmente.
Vou atualizar o código, pois acho que até me perdi já.

Segue abaixo:

PHP

<?php

//Chama a conexão do Banco de Dados.
require_once 'Conexao.Class.php';

//Chamada de parâmetros via GET
//$usuario = $_GET['nm_login'];
//$senha = $_GET['ds_senha'];

$usuario = $_POST['nm_login'];
$senha = $_POST['ds_senha'];

$sql = "SELECT * FROM TB_LOGIN WHERE nm_login = '$usuario' AND ds_senha = '$senha'";

$resultado = mysql_query($sql) or die("Erro: ".mysql_error());

if (mysql_num_rows($resultado) > 0) {
            echo 1;
        } else {
            echo 0;
        }

?>

JAVA

package br.com.videoaulasneri.conexaoweb;

import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import br.com.videoaulasneri.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
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 etUsuario, etSenha;
    Button btAcessar;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.logar);
        
        etUsuario=(EditText) findViewById(R.id.editUsuario);
        etSenha=(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://10.0.2.2/projeto/ValidaUsuario.php";
				//String urlGet="http://10.0.2.2/projeto/ValidaUsuario.php?nm_login="+etUsuario.getText().toString()+"&ds_senha="+etSenha.getText().toString();
				ArrayList<NameValuePair> parametrosPost = new ArrayList<NameValuePair>();
				parametrosPost.add(new BasicNameValuePair("nm_login",etUsuario.getText().toString()));
				parametrosPost.add(new BasicNameValuePair("ds_senha",etSenha.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+", "");
					System.out.println(resposta.length());
					for (int i = 0; i < resposta.length(); i++) {
						System.out.println((int)resposta.charAt(0));
					}
					/*int codResposta = -1;
					try {
						codResposta = Integer.parseInt(resposta);
					} catch (NumberFormatException nfe) {
						Log.w("Logar", "Erro ao tentar converter para número: "+nfe);
					}*/
					if (resposta == "1")
						//startActivity(new Intent(Logar.this,MenuPrincipal.class));
						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();
	   }
}

Segue o último log também:

09-27 22:28:59.443: I/logar(436): entrou no evento
09-27 22:28:59.443: I/logar(436): vai entrar no try
09-27 22:28:59.703: I/Logar(436): Resposta = [1
09-27 22:28:59.703: I/Logar(436): ]
09-27 22:28:59.703: I/System.out(436): 1
09-27 22:28:59.703: I/System.out(436): 49
A

coloca também o codigo do “ConexaoHttpClient.executaHttpPost”

G
marcoostan:
Segue abaixo:

PHP

<?php

//Chama a conexão do Banco de Dados.
require_once 'Conexao.Class.php';

//Chamada de parâmetros via GET
//$usuario = $_GET['nm_login'];
//$senha = $_GET['ds_senha'];

$usuario = $_POST['nm_login'];
$senha = $_POST['ds_senha'];

$sql = "SELECT * FROM TB_LOGIN WHERE nm_login = '$usuario' AND ds_senha = '$senha'";

$resultado = mysql_query($sql) or die("Erro: ".mysql_error());

if (mysql_num_rows($resultado) > 0) {
            echo 1;
        } else {
            echo 0;
        }

?>
Ah, tome cuidado com uma coisa aqui: Tudo que está fora do bloco de script será cuspido na saída, então se tiver algum espaço,Enter ou caractere a mais tudo isso vai ser mandado para o programa client.

_________________________________________

E só para constar.... se estiver disposto a usar o Appelation Mode troque isso:
resposta = resposta.replaceAll("\\s+", "");
por isso
resposta = resposta.replaceAll("\\W", "");
Acho que vai funcionar na hora hehe :D
M
aechiara:
coloca também o codigo do "ConexaoHttpClient.executaHttpPost"
Segue abaixo código da classe ConexaoHttpClient..
package br.com.videoaulasneri.conexaoweb;
//biblioteca de java
import java.util.ArrayList;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
//bibliotecas http
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;


public class ConexaoHttpClient {
	public static final int HTTP_TIMEOUT = 30 * 1000;
	private static HttpClient httpClient;
	
	private static HttpClient getHttpClient() {
		if (httpClient == null) {
			httpClient = new DefaultHttpClient();
			final HttpParams httpParamns = httpClient.getParams();
			HttpConnectionParams.setConnectionTimeout(httpParamns, HTTP_TIMEOUT);
			HttpConnectionParams.setSoTimeout(httpParamns, HTTP_TIMEOUT);
			ConnManagerParams.setTimeout(httpParamns, HTTP_TIMEOUT);
		}
		return httpClient;
	}

	public static String executaHttpPost(String url, ArrayList<NameValuePair> parametrosPost) throws Exception {
		BufferedReader bufferedReader = null;
		try {
			HttpClient client = getHttpClient();
			HttpPost httpPost = new HttpPost(url);
			UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parametrosPost);
			httpPost.setEntity(formEntity);
			HttpResponse httpResponse = client.execute(httpPost);
			bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
			StringBuffer stringBuffer = new StringBuffer("");
			String line = "";
			String LS = System.getProperty("line.separator"); // \s
			while ((line = bufferedReader.readLine()) != null) {
				stringBuffer.append(line + LS);
			}
			bufferedReader.close();

			String resultado = stringBuffer.toString();
			return resultado;
		} finally {
			if (bufferedReader != null) {
				try {
					bufferedReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
	
	public static String executaHttpGet(String url) throws Exception {
		BufferedReader bufferedReader = null;
		try {
			HttpClient client = getHttpClient();
			HttpGet httpGet = new HttpGet(url);			
			httpGet.setURI(new URI(url));
			HttpResponse httpResponse = client.execute(httpGet);
			bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
			StringBuffer stringBuffer = new StringBuffer("");
			String line = "";
			String LS = System.getProperty("line.separator"); // \s
			while ((line = bufferedReader.readLine()) != null) {
				stringBuffer.append(line + LS);
			}
			bufferedReader.close();

			String resultado = stringBuffer.toString();
			return resultado;
		} finally {
			if (bufferedReader != null) {
				try {
					bufferedReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}			

	}
}
M

gomesrod:

Ah, tome cuidado com uma coisa aqui: Tudo que está fora do bloco de script será cuspido na saída, então se tiver algum espaço,Enter ou caractere a mais tudo isso vai ser mandado para o programa client.

Não entendi aqui…
Poderia me auxiliar, por favor?


gomesrod:
E só para constar… se estiver disposto a usar o Appelation Mode troque isso:

por isso

Acho que vai funcionar na hora hehe
:D

Fiz isso e não funcionou… =/

G

marcoostan:
gomesrod:

Ah, tome cuidado com uma coisa aqui: Tudo que está fora do bloco de script será cuspido na saída, então se tiver algum espaço,Enter ou caractere a mais tudo isso vai ser mandado para o programa client.

Não entendi aqui…
Poderia me auxiliar, por favor?


Quis dizer que o que está dentro do bloco “<?php” é script, e manda para a saída o que é passado ao comando echo, ok ?
Mas o que está fora desse bloco é considerado “página”, ou seja, é enviado direto para a saída; para entender melhor o que estou dizendo, coloque um sinal qualquer no começo do seu arquivo .php, e outro no final. Mais ou menos assim:

INICIO<?php

… restante da pagina …

?>FIM

Agora rode o programa (com aqueles System.out.println() que vc já está usando para debugar o problema), e veja o que ele imprime. As palavras INICIO e FIM saíram junto, certo?
Então… da mesma maneira pode ter algum outro tipo de sujeira que está sendo enviada para a saída do programa PHP.
Uma eu acho que sei o que é: não pode dar depois do ?> , senão essa quebra de linha vai junto (e tem justamente uma quebra de linha chegando na variavel!)

Fiz isso e não funcionou… =/[/quote]
Que pena… tinha certeza que ia funcionar, porque essa expressão retira tudo que não é letra e número. Como fica a saída daqueles prints quando faz dessa forma?

M

gomesrod:
marcoostan:
gomesrod:

Ah, tome cuidado com uma coisa aqui: Tudo que está fora do bloco de script será cuspido na saída, então se tiver algum espaço,Enter ou caractere a mais tudo isso vai ser mandado para o programa client.

Não entendi aqui…
Poderia me auxiliar, por favor?


Quis dizer que o que está dentro do bloco “<?php” é script, e manda para a saída o que é passado ao comando echo, ok ?
Mas o que está fora desse bloco é considerado “página”, ou seja, é enviado direto para a saída; para entender melhor o que estou dizendo, coloque um sinal qualquer no começo do seu arquivo .php, e outro no final. Mais ou menos assim:

INICIO<?php

… restante da pagina …

?>FIM

Agora rode o programa (com aqueles System.out.println() que vc já está usando para debugar o problema), e veja o que ele imprime. As palavras INICIO e FIM saíram junto, certo?
Então… da mesma maneira pode ter algum outro tipo de sujeira que está sendo enviada para a saída do programa PHP.
Uma eu acho que sei o que é: não pode dar depois do ?> , senão essa quebra de linha vai junto (e tem justamente uma quebra de linha chegando na variavel!)

Fiz isso e não funcionou… =/


Que pena… tinha certeza que ia funcionar, porque essa expressão retira tudo que não é letra e número. Como fica a saída daqueles prints quando faz dessa forma?
[/quote]

Agora entendi.
Infelizmente não tem espaço depois do “?>”, não identifiquei nada fora do “<?php ?>” que esteja gerando espaço…

M

Não sei porque, mas acho que o erro estaria na classe ConexaoHttpClient por aqui:

bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
			StringBuffer stringBuffer = new StringBuffer("");
			String line = "";
			String LS = System.getProperty("line.separator"); // \s
			while ((line = bufferedReader.readLine()) != null) {
				stringBuffer.append(line + LS);
			}
			bufferedReader.close();

			String resultado = stringBuffer.toString();
			return resultado;

Alguém mais poderia me ajudar, por favor?

G
marcoostan:
Não sei porque, mas acho que o erro estaria na classe ConexaoHttpClient por aqui:
bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
			StringBuffer stringBuffer = new StringBuffer("");
			String line = "";
			String LS = System.getProperty("line.separator"); // \s
			while ((line = bufferedReader.readLine()) != null) {
				stringBuffer.append(line + LS);
			}
			bufferedReader.close();

			String resultado = stringBuffer.toString();
			return resultado;

Alguém mais poderia me ajudar, por favor?

Você está certo, de fato um dos erros está aqui mesmo!
Repare que sempre é adicionada uma quebra de linha no final da resposta. Essa é aquela quebra de linha que tem depois do "1", e eu tinha pensado que estava no final do arquivo .php
Mude a lógica para só colocar uma quebra de linha quando efetivamente existirem mais linhas para adicionar.
Ou uma sugestão melhor ainda: use um padrão de comunicação que não dependa tanto desses detalhes como quebra de linha e espaço; por exemplo XML ou JSON. Mas por enquanto deixe assim até fazer funcionar, depois melhore.

---------------

Agora o outro erro (o caractere esquisito), mais um palpite: pode ser uma diferença de encoding entre o servidor (php) e o client. Force um mesmo charset a ser usado nos dois lados.
No início do bloco header('Content-type: text/html; charset=utf-8');

E use o mesmo no construtor do InputStreamReader, trocando
new InputStreamReader(httpResponse.getEntity().getContent())
por:
new InputStreamReader(httpResponse.getEntity().getContent(), "utf-8")

M

Acho que estamos chegando lá! rsrs

Colocando as informações de “utf-8” sumiu o caractere que aparecia no log.

Segue log: 10-01 15:58:45.179: I/logar(330): entrou no evento 10-01 15:58:45.179: I/logar(330): vai entrar no try 10-01 15:58:45.279: I/Logar(330): Resposta = [1 10-01 15:58:45.279: I/Logar(330): ] 10-01 15:58:45.279: I/System.out(330): 1 10-01 15:58:45.279: I/System.out(330): 49

Quanto a mudança de lógica naquele pedaço do código você poderia me auxiliar, por favor?
Não sei a melhor maneira de fazê-lo.

Obrigado pela força! :smiley:

A

eu não mudaria nada lá ele só concatena um caractere de nova linha, faz um trim agora

G

[quote=aechiara]eu não mudaria nada lá ele só concatena um caractere de nova linha, faz um trim agora

Tem razão, é uma maneira mais prática de resolver.
Mas em vez de fazer o trim só para mostrar, melhor já substituir o valor da variável:

M

Bom, está quase funcionando.
Só precisa evitar essa quebra de linha para não retornar mais false.

Segue último log após utilização do trim:

10-01 22:00:10.443: I/logar(467): entrou no evento 10-01 22:00:10.443: I/logar(467): vai entrar no try 10-01 22:00:10.653: I/Logar(467): Resposta = [1] 10-01 22:00:10.664: I/System.out(467): 1 10-01 22:00:10.664: I/System.out(467): 49

Alguma ideia?

A
nunca vai retornar verdadeiro isso, String é um objeto então vc tem que usar o equals

nunca vai retornar verdadeiro isso, String é um objeto então vc tem que usar o equals

M

Poxa, fiz tantas edições que nem tinha percebido este erro.

FINALMENTE FUNCIONOU :smiley:

MUITO obrigado à TODOS pela ajuda, de coração.
Não sabem o quanto fico feliz.

Podem colocar o tópico como “Resolvido”.

Mais uma vez obrigado.

Um abraço à todos,
Marco Ostan

E

Ressuscitando o tópico.
Vi que já está resolvido, mais não entendi bem como chegou na solução.

Eu resolvi da seguinte forma.

Antes

String resposta = respostaRetornada.toString(); resposta = resposta.replaceAll("\\s+", "");
Depois

Comigo funcionou.

Criado 23 de setembro de 2012
Ultima resposta 26 de mai. de 2013
Respostas 39
Participantes 8