Pereiti prie turinio

Android app, perduoti duomenis POST, GET metodu


Rekomenduojami pranešimai

Sveiki.

 

Kuriu vieną (pirmą) androido appsą ir bėda tame, kad reikia perduoti duomenis į servą. turiu ten pakures php failiuką, ir reikia iš appso perduoti duomenis POST ar GET metodu. Nera skirtumo. Bandziau googlintis, yra tu pavyzdziu bet pagal juos man nieko nesigauna ir ar tikrai ten tiek daug vargo yra? Negi nera kokios paprastos funkcijos? ten kokio iclude su nuorado ir viskas? :D nzn, prasau pagalbos. ..

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Yra visokių bibliotekų palengvinančių darbą, pats gali dar pasirašyt dėl patogumo, bet čia toks standartinis - universalus būdas, paleidi AsyncTask'ą ir jame HTTP request'as, nes pagrindiniame thread'e negali to daryt. Čia POST metodu, jei reikia GET, tai prie url lipdyk tuos parametrus.

 

private class makeRequest extends AsyncTask<String, Void, Boolean>
{
private ProgressDialog dialog;
private Context context;
public makeRequest(Context context)
{
	this.dialog = new ProgressDialog(context);
	this.context = context;
}

@Override
protected void onPreExecute()
{
	this.dialog.setMessage("Loading...");
	this.dialog.setCancelable(false);
	this.dialog.show();
}

@Override
protected Boolean doInBackground(String... arg0)
{
	try
	{
		HttpClient httpclient = new DefaultHttpClient();
		HttpPost httppost = new HttpPost("URL");
		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		nameValuePairs.add(new BasicNameValuePair("post_data1", "data"));
		nameValuePairs.add(new BasicNameValuePair("post_data2", "data"));
		httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

		HttpResponse httpresponse = httpclient.execute(httppost);
		StatusLine statusline = httpresponse.getStatusLine();
		if(statusline.getStatusCode() == HttpStatus.SC_OK)
		{
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			httpresponse.getEntity().writeTo(out);
			out.close();
			String result = out.toString(); // išvestas rezultatas
		}
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	return null;
}

@Override
protected void onPostExecute(final Boolean success)
{
	try {
	if(this.dialog.isShowing())
		this.dialog.dismiss();
	} catch(Exception e){}
}
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

List, then ArrayList, is this real life? :lol: :lol:

 

var loljava = new NameValueCollection();

 

C# has swag

 

List yra interface'as, o ArrayList yra pilnai implementuota klasė. Tarp kitko, List interface'as implementuotas nemažai klasių, pavyzdžiui, LinkedList, ArrayList, Vector, Stack. Bet jeigu mums reikia tik List interface'o metodų, tai ir rašom List<Object> a = new SomethingList<Object>().

 

O tu žiūriu nuoširdžiai nekenti Java'os, nes net prie tokių menkniekių prikimbi.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Galima naudoti Jsoup library. Beto, jei ateityje reiktų scrapinti HTML, tai padaryti yra be galo lengva.

 

Oficialus puslapis: http://jsoup.org/

Dokumentacija: http://jsoup.org/cookbook/

 

BEJE, Google nerekomenduoja naudoti HttpClient (vietoj HttpClient naudoti HttpURLConnectioin). Pasiskaityk dokumentaciją. Taip pat, AsyncTask yra blogis. Geriau naudot loaderius kaip (AsyncTaskLoader) tavo atveju, kadangi juose yra integruotas kofigūracijos kitimo palaikymas. Tai yra, jei naudojant AsyncTask pasuksi ekraną, kol paprastas AsyncTask loadins, tavo appsas crashins. Tu to NENORI ! O jei jau užsispyrei loaderio nenaudot, teks rašyt konfigūracijos palaikymą pačiam.

 

Jei naudoji Android Studio galima naudoti biblioteką pasinaudojus gradle sistema, tarp dependencies įrašius:

compile 'org.jsoup:jsoup:1.7.3'

dependencies {
   compile 'com.android.support:support-v13:19.+'
   compile fileTree(dir: 'libs', include: ['*.jar'])
   compile 'org.jsoup:jsoup:1.7.3'
}

 

POST metodo pavyzdys su Jsoup būtų:

 

Connection.Response response = Jsoup.connect("TAVO_URL"))
                       .data("name", "value", "name2", "value2", ...)
                       .timeout(5000) // 5s timeout'as
                       .method(Connection.Method.POST)
                       .execute();

System.out.println(response);

// Cookies reikia tuo atveju, jei loginiesi i tinklapį.
String cookie = response.cookie("SESSION_ID_PAVADINIMAS"); 

// Cia GET metodas, jau prisiloginus (jei logintis nereikia - .cookie taip pat nereikia)
               Document document = Jsoup.connect("TAVO_URL_2")
                       .cookie("SESSION_ID_PAVADINIMAS", cookie)
                       .get();

System.out.println(document);

 

Tokiems dalykams kaip SESSION ID pasižiūrėti, puikus dalykas yra Live HTTP Headers pluginas Google Chrome'ui, galbūt yra ir Firefox'ui.

 

Sėkmės :)

Redagavo Eras
Nuoroda į pranešimą
Dalintis kituose puslapiuose
Tai yra, jei naudojant AsyncTask pasuksi ekraną, kol paprastas AsyncTask loadins, tavo appsas crashins.

Iš patirties galiu sakyt, kad taip nėra. Visad naudojau AsyncTask'ą ir visad gerai buvo, žinoma su tokiu mini-helper'iu pasirašytu, bet tas pats. Ir įdomiai čia su tuo jsoup'u, iš tavo kodo pavyzdžio galima spręst, kad jis užklausas main thread'e daro, tai turi mest NetworkOnMainThreadException, nebent pati biblioteka per ThreadPolicy išjungia šitą reikalavimą, bet išjungt nereikėtų.

EDIT: ne taip supratau, turbūt turėjai galvoj tą kodo pavyzdį AsyncTask'e įdėtą.

Redagavo Gintaszz
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, matyt, mūsų patirtys skirias. Aš Taską iškeičiau į loaderį, man su juo tiesiog patogiau ir lenvviau dirbti.

Kitas dalykas, dėl Jsoup, taip, šitas kodas turėtų būti AsyncTask'e arba Loaderyje, be kita ko jis turėtų būti ir tarp try catch, kadangi reikia handlint IOException. Nepagalvojau įkeldamas kodą, tuo metu tai traktavau kaip savaime suprantamą dalyką. ;)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Karštos temos

×
×
  • Sukurti naują...