[Android Studio] - AsyncTask + POST + JSON

0

Mój problem jest taki - chcę wysłać na serwer prostymi metodami
zapytanie przez POST i dostać odpowiedz w JSON

Jak mam zmodernizować "doInBackground" by zadzaiałało.

Jest w necie wiele przykładów lecz wszystkie przez GET lub Volly opsługiwane.

Czyli tworzę połączenie:

  • HttpURLConnection
  • następnie przy pomocy "HashMap<String, String>" wkładam dane do zmiennych
  • otrzymuje "Response" w formacie JSON i odczytuje je.

Czy mogę poprosić o uzupełnienie kodu gdyż jestem początkujący w Android + Java


private class PostJSON extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            String url = "https://mojadres-z-php-post";
            
			//HashMap<String, String> contact = new HashMap<>();            
            //contact.put("id", id);
            //contact.put("data-1", data1);
            //contact.put("data-2", data2);
            //contact.put("data-3", data3);            

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);            
        }            

5

Należy zapomnieć, że istnieją takie klasy jak AsyncTask i HttpURLConnection i skorzystać z OkHttp (https://square.github.io/okhttp). Serio. Nie wymądrzam się.

3

Nie idź tą drogą. Retrofit + Gson (lub alternatywa) + RxJava. Dodatkowo, Kotlin/wyrażenia lambda lub chociaż Java 8/ lambda.

Tutorial: https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845

(składnia bez wyrażeń lambda, jak zmienisz to kod się jeszcze uprości,)

0

Na razie odpaliłem coś takiego lecz nie dostaję nic. W której linijce mam błąd?


private final OkHttpClient client = new OkHttpClient();
				TextView txtString;
				
				public class MainActivity extends AppCompatActivity {

					@Override
					protected void onCreate(Bundle savedInstanceState) {
						super.onCreate( savedInstanceState );
						setContentView( R.layout.activity_main );
						FloatingActionButton fab = findViewById( R.id.fab );
						txtString = (TextView)findViewById(R.id.textview_first);
					}
					
					@Override
					private void myOKHttpDemo () {
						
						HttpUrl.Builder urlBuilder = HttpUrl.parse("http://get.php").newBuilder();
						urlBuilder.addQueryParameter("data-1", "demotext-1");
						urlBuilder.addQueryParameter("data-2", "demotext-2");
						urlBuilder.addQueryParameter("data-3", "demotext-3");
						String url = urlBuilder.build().toString();
						Request request = new Request.Builder().url(url).build();
						client.newCall(request).enqueue(new Callback() {
							@Override
							public void onFailure(@NotNull Call call, @NotNull IOException e) {

							}	

							@Override
							public void onResponse(Call call, final Response response) throws IOException {
								try {
									String responseData = response.body().string();
									JSONObject json = new JSONObject(responseData);
									final String owner = json.getString("mydata");
									runOnUiThread( new Runnable() {
										@Override
										public void run() {
											txtString.setText("owner");
										}
									} );
									} catch (JSONException e) {
								}
							}
						});
					}

0

Tak uprawnienia posiadam.
Myślę jak czytałem że muszę skonfigurować .body lecz jakoś nie wiem jak to dodać

1

Przede wszystkim nie połykaj wyjątku przy sukcesie i obsłuż metodę onFailure, bo może akurat tam się coś wywala. Pokaż jaki błąd Ci wyskakuje w logach czy gdziekolwiek, bo tak to można tylko zgadywać, że coś nie działa.

0

zauważyłem że dostaję odpowiedz z serwera, jest nim że wartości nie zostały przesłane przez POST.

if (($_SERVER["REQUEST_METHOD"] == "POST") && (isset($_POST['data-1'])) && (isset($_POST['data-2']))) {
....... kod ....
} else {
    echo "nie otrzymano danych";
    exit();
}
1

To wyślij przez POST. Request.Builder() ma na sobie metodę post() do tego. Ewentualnie zmień na serwerze na GET i zmień obsługę danych wejściowych, żeby była robiona za pomocą query.

0

Poszło dzięki takiemu zapytaniu. Wysyła się przez POST.
Dzięki za komentarze do posta.

                RequestBody formBody = new FormBody.Builder()
                        .add("data-1", "mydata-1")
                        .add("data-2", "mydata-2")
                        .add("data-3", "mydata-3")
                        .build();
                Request request = new Request.Builder()
                        .url("http://get.php")
                        .post(formBody)
                        .build();

1 użytkowników online, w tym zalogowanych: 0, gości: 1