[Android Studio] - AsyncTask + POST + JSON

[Android Studio] - AsyncTask + POST + JSON
TM
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 3 lata
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

Kopiuj

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

Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
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ę.

ME
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:638
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,)

edytowany 2x, ostatnio: Meini
TM
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 3 lata
0

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

Kopiuj

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

edytowany 1x, ostatnio: TomekMus
MD
Jaki błąd dostajesz? Masz dodane uprawnienia do internetu?
TM
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 3 lata
0

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

edytowany 1x, ostatnio: TomekMus
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
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.

edytowany 2x, ostatnio: Michał Sikora
TM
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 3 lata
0

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

Kopiuj
if (($_SERVER["REQUEST_METHOD"] == "POST") && (isset($_POST['data-1'])) && (isset($_POST['data-2']))) {
....... kod ....
} else {
    echo "nie otrzymano danych";
    exit();
}
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
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.

edytowany 2x, ostatnio: Michał Sikora
TM
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 3 lata
0

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

Kopiuj
                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();
edytowany 1x, ostatnio: TomekMus
ME
Ok, ale i tak bez sensu robić to w ten sposób
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)