Jump to content

[Resolvido] Problema Android envio app->servidor servidor->app


Recommended Posts

Posted (edited)

Boa noite, estou com mais um problema.

eu estou a enviar um json para um servidor, no servidor faço um processamento de base de dados e depois envio um json para a app outra vez

Eu estou a enviar e receber o json da seguinte maneira:

private class enviarcoord extends AsyncTask{

@Override


protected JSONArray doInBackground(JSONObject... params) {
// TODO Auto-generated method stub

JSONObject Jobj =params[0];
HttpClient httpclient = new DefaultHttpClient();
HttpResponse resposta;
String respostasv ="";
JSONArray jsonArr = new JSONArray();

try{

HttpPost post = new HttpPost("MEU SITE ONLINE");
post.setEntity(new StringEntity(Jobj.toString(), "UTF8"));
resposta = httpclient.execute(post);

Log.i("Http Response:",resposta .toString());
String temp = EntityUtils.toString(resposta.getEntity());
Log.i("tag", temp);

//bota tentar

StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("MEU SITE ONLINE");
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
Log.e(ParseException.class.toString(), "Failed to download file");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
respostasv = builder.toString();


// tratar a resposta

jsonArr = new JSONArray(respostasv);



}

catch (ClientProtocolException e) {
e.printStackTrace();
Log.i("ClienteProt", "ClientProtocolException");

}

catch (IOException e) {
e.printStackTrace();
Log.i("IOE", "IOException");

} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i("IOE", "erro a criar o array json");
}

// se der erro o return vai devolver vazio
return jsonArr;
}

no servidor recebo o json e faço o processamento assim:

require_once "db/DB.php"; //connect to a database/disconnect handler.



$jobj = json_decode($HTTP_RAW_POST_DATA);

$earth_radius = 3960.00; # em milhas

$MlocLat_1 = $jobj->Latitude;
$MlocLon_1 = $jobj->Longitude;
$Distancia = $jobj->Distancia;

// VALORES DE TESTES
/*

$MlocLat_1 = "41.6529";
$MlocLon_1 = "-8.58453";
$Distancia =1;

*/


$conjcoord = 0;

$db = DB::getDB();
$sql = "SELECT * FROM coordenada";
$idterreno=0;

$result=$db->query($sql);


while($row=$result->fetch_object()){
$conjcoord++;

if(distance_haversine($MlocLat_1, $MlocLon_1, $row->Latitude, $row->Longitude) <= $Distancia*1000){


if($idterreno != $row->id_info){
$sql2 = "SELECT * FROM informacao WHERE Id_informacao= $row->id_info ";
$result2=$db->query($sql2);


while($row2=$result2->fetch_object()){
$output[]=$row2;
}
$idterreno =$row->id_info;
}

}


}


//########### calculo distancia entre pontos gps
function distance_haversine($lat1, $lon1, $lat2, $lon2) {
global $earth_radius;



$delta_lat = $lat2 - $lat1 ;
$delta_lon = $lon2 - $lon1 ;

$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$distance = $distance * 1.609344;
return $distance;
}


print (json_encode($output));


?>

o problema é o seguinte, se eu usar os valores de teste que estão comentados a app envia o json é processado e recebe o json resultante, mas quando uso os valores do json que a app envia ele é recebido na mesma é processado e o json para ser recebido é gerado igual, so que a app o que recebe é como se fosse vazio.

LogCat da app a usar os valores de teste estaticos no servidor:

08-03 21:36:16.708: I/Http Response:(1001): org.apache.http.message.BasicHttpResponse@40d1f358
08-03 21:36:16.781: I/tag(1001): [{"Id_informacao":"2","Descricao":"Feira ","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "},{"Id_informacao":"11","Descricao":"Feira 2","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "},{"Id_informacao":"12","Descricao":"Feira 3","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "},{"Id_informacao":"13","Descricao":"Feira 4","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "}]

LogCat da app a usar os valores que vão no json que ela envia:

08-03 21:37:50.117: I/Http Response:(1001): org.apache.http.message.BasicHttpResponse@40d64b40
08-03 21:37:50.120: I/tag(1001): [{"Id_informacao":"1","Descricao":"minha descricao","Nome_pessoa":"meu nome","Contacto":"912345678","Morada":"minha morada"},{"Id_informacao":"2","Descricao":"Feira ","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "},{"Id_informacao":"11","Descricao":"Feira 2","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "},{"Id_informacao":"12","Descricao":"Feira 3","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "},{"Id_informacao":"13","Descricao":"Feira 4","Nome_pessoa":"Rick","Contacto":"916456238","Morada":"Freixo "}]

NOTA: Peço desculpa por postar tudo em modo respostas mas nao estava a conseguir postar tudo junto

Edited by Rick45
Posted

Boas penso que descobri qual o meu problema, so que nao sei como resolver :S

penso que será aqui:

try{

HttpPost post = new HttpPost("MEU SITE ONLINE");
post.setEntity(new StringEntity(Jobj.toString(), "UTF8"));
resposta = httpclient.execute(post);                                          // <---- Eu aqui executo o meu post onde envia os valores para processar no site

Log.i("Http Response:",resposta .toString());
String temp = EntityUtils.toString(resposta.getEntity());
Log.i("tag", temp);

//bota tentar

StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("MEU SITE ONLINE");       
try {                                                                                     
HttpResponse response = client.execute(httpGet);   //<---- aqui eu executo o get para ir buscar os valores penso que o problema será aqui 


StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
Log.e(ParseException.class.toString(), "Failed to download file");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
respostasv = builder.toString();

Penso que o problema poderá ser que quando eu faço o get os valores que enviei no post ja nao estão lá logo o servidor nao processa nada, logo nao envia nada pk nao processou.

Como é que posso enviar os valores e receber o resultado na mesma "ligação"???

Posted

Podes mandar imprimir o que tens no Jobj (com o toString()) e ver se a informação que consta está correcta.

Não sei se estás a falar no GET, mas se é a isso que te referes é normal que não seja enviada nenhuma informação nessa chamada. O HTTP é stateless. O estado não é partilhado entre chamadas.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

Podes mandar imprimir o que tens no Jobj (com o toString()) e ver se a informação que consta está correcta.

Não sei se estás a falar no GET, mas se é a isso que te referes é normal que não seja enviada nenhuma informação nessa chamada. O HTTP é stateless. O estado não é partilhado entre chamadas.

pois, o problema era mesmo esse, quando eu fazia o get ja nao havia valores lá, assim consegui resolver o problema visto que neste caso não precisava obrigatoriamente de enviar um json enviei os valores no no GET por url

HttpGet httpGet = new HttpGet("http://OMEUSAITE/proc.php?Lat="+URLLat+"&Lon="+URLLon+"&Dist="+URLDis);

no php recebi os valores com o $_GET e ficou a funcionar certinho.

Posted

Mas podes sempre enviar por POST em JSON e receber a resposta na mesma chamada.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

  • 6 months later...
Posted

OI pessoal, estou com um problema parecido. Estou a fazer uma aplicação android e ela esta estoirando. O codigo a partida esta bem pois eu corri esse codigo noutro projecto e esta funcionando, e neste esta a estoirar. Fiz uma async task pois poderia ser de excesso de processos mas continua estoirando e nao chega a executar o comando resposta = httpclient.execute(post); alguém consegue ajudar, precisa mais detalhes?

Posted

O que diz o log? Que erro aparece?

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.