PDA

Prikaži potpunu verziju : Web Servis i Android


Milinko
17.7.2013, 11:43
Kako da napravim web servis koji ce biti povezan sa android aplikacijom?
Aplikacija mora da prima i salje podatke na web sajt koji treba da napravim, pa kako to sve da povezem? Sta mi treba, kako da to napravim i moze primjer koda kako bi to trebalo da izgleda? Hvala

Ivan452
17.7.2013, 15:23
Najjednostavnije resenje je da napravis php stranicu (stranice) koja ce iz URL-a da preuzima parametre, upisuje u bazu i/ili vrsi citanje iz nje.

To je lako savladati, ali nije bas toliko kratko da mogu sve da ti sada objasnim. Dacu ti neke smernice. Kljucne reci za pretragu koje ce ti trebati su: PHP, MySQL, HTTP GET, Android http request/response.
Ovo se moze podeliti u dve odvojene celine: server i klijent. Na serverskoj strani imas php i MySQL, na klijentskoj Android a komunikaciju obavljas putem HTTP Request/Response-a.

Prvo ti savetujem da napravis serversku stranu i da to testiras. Za uslove testiranja dovoljno ce biti da napravis php stranu koja ce da pokupi 2 podatka iz URL-a, upise ih u bazu i prikaze neku poruku.
Procitaces detaljnije, ali kada koristis HTTP Get metodu za request-response onda se vrednosti promenljivih salju u okviru URL-a, npr: www.mysite.com/myphp.php?val1=123&val2=321
Znaci ovde na svom sajtu imas myphp.php stranu kojoj prosledjujes dva parametra (val1 i val2).

I npr ako ti ovako izgleda stranica myphp.php:

<?php

$val1 = $_GET['val1'];
$val2 = $_GET['val2'];
print $val1;
Print " ";
print $val2;

?>

Onda kada u browser-u pozoves www.mysite.com/myphp.php?val1=123&val2=321 dobices stranicu na kojoj ce samo pisati: 123 321
U kodu php stranice mozes da stavis neke operacije sa bazom, zavisno od toga sta ti treba.

I ovo ti je serverska strana. Za testiranje serverske strane ti nije potrebna Android aplikacija, mozes da testiras iz svog browser-a tako sto ces pozivati odgovarajuci URL sa odgovarajucim prosledjenim parametrima.
Na android strani dovoljan ce ti biti sledeci kod:

byte[] data;
HttpGet httpget;
StringBuffer buffer = null;
HttpResponse response;
HttpClient httpclient;
InputStream inputStream;
try
{
httpclient = new DefaultHttpClient();
httpget = new HttpGet(www.mysite.com/myphp.php?val1=123&val2=321);
response = httpclient.execute(httpget);
inputStream = response.getEntity().getContent();
data = new byte[256];
buffer = new StringBuffer();
int len = 0;

while (-1 != (len = inputStream.read(data))) {buffer.append(new String(data, 0, len));}
inputStream.close();

}catch (Exception e) {System.out.println(e);}

Kada se ovo zavrsi vrednost promenljive buffer ce biti: 123 321
Ovo je stari neki kod, trebao bi da funkcionise. Mozda postoje neka nova eneganija resenja, neke nove klase, paketi ili sta vec (ako ti treba potrazi, kljucna rec Android call HTTP Get).
Jos jedna bitna stvar, da bi ti aplikacija funkcionisala na androidu 4+ sve network operacije moras da pozoves uokviru odvojenog threada ili async taksa.

Ovo je najjednostavnije resenje koje mi pada napamet. Ako hoces nesto malo komplikovanije prvo mozes da koristis HTTP POST umesto HTTP GET-a. Onda, serverska strana moze da implementira ReST, da podatke saljes u okviru JSON-a ili XML-a, a onda da uz sve to da ukljucis i Google App Engine. Postoji milion nacina, ali ako se secam ovo ti je za neki seminarski pa ne moras preterano da komplikujes.

Geomaster
17.7.2013, 15:52
^ Slažem se sa svime, samo bih da napomenem da je preporučljivije da za takvo slanje podataka koristi HTTP POST. Možda u 90% slučajeva to neće praviti neku razliku, ali ako se šalje dosta podataka HTTP serveru može da se desi da zabode limit koji server postavlja za dužinu URL-a, dok se sa POST podacima to ne dešava. Česta praksa je da se za zahteve koji ne menjaju ništa na serveru koristi GET, a za zahteve koji predstavljaju neku akciju i nisu pasivni koristi POST. Ali ako pravi HTTP API ništa ga ne košta da sve bude POST :)

Ivan452
17.7.2013, 16:22
^ Slažem se sa svime, samo bih da napomenem da je preporučljivije da za takvo slanje podataka koristi HTTP POST. Možda u 90% slučajeva to neće praviti neku razliku, ali ako se šalje dosta podataka HTTP serveru može da se desi da zabode limit koji server postavlja za dužinu URL-a, dok se sa POST podacima to ne dešava. Česta praksa je da se za zahteve koji ne menjaju ništa na serveru koristi GET, a za zahteve koji predstavljaju neku akciju i nisu pasivni koristi POST. Ali ako pravi HTTP API ništa ga ne košta da sve bude POST :)

Slazem se za POST. Ali, kako se prvi put susrece sa ovim bolje je da odradi za pocetak sa GET-om. Jer ce tako moci da testira iz pretrazivaca, dok ako ide sa POST-om onda ce morati da uradi i klijentsku stranu, i kako je velika verovatnoca da nece funkcionisati prvi put kada pokrene lakse ce sa GET-om da ulovi gresku.
Zato sam ga stavio kao eventualno dodatno poboljsanje.

Geomaster
17.7.2013, 16:23
Slazem se za POST. Ali, kako se prvi put susrece sa ovim bolje je da odradi za pocetak sa GET-om. Jer ce tako moci da testira iz pretrazivaca, dok ako ide sa POST-om onda ce morati da uradi i klijentsku stranu, i kako je velika verovatnoca da nece funkcionisati prvi put kada pokrene lakse ce sa GET-om da ulovi gresku.
Zato sam ga stavio kao eventualno dodatno poboljsanje.
Nisam pažljivo pročitao tvoj post pa nisam video da si i to predložio na kraju. Izvinjavam se :)

Milinko
22.7.2013, 13:41
Uspio sam, hvala vam. :)

Ivan-94
23.7.2013, 4:28
Preporucio bih ti nesto kao sto je Laravel (http://laravel.com/). On podrzava nesto sto se zove restful routing. Lako mozes da napravis restful API. Takodje mozs da output-ujes JSON pomocu Response::json(...) ili od L4 mozes da samo vratis skup modela i on ce da ti prikaze json.

Evo ti jedan tutorial http://net.tutsplus.com/tutorials/php/laravel-4-a-start-at-a-restful-api/
Znam da je malo teze posto mozda nisi radio sa MVC-om ali mnogo je bolje.

Milinko
23.7.2013, 16:25
OK, pogledacu. Hvala :)