JSON VOLLEY Post

wer112

Top Contributor
Ich arbeite im App Store ständig mit Volley. Meistens mit StringRequest. Habe im Store auch ObjetJSON Abfragen.
Ich habe mir den Code noch mal angesehen. Leider postet er keine Werte an die Webseite. Ich kann auch in den Params nix auslesen.
Entweder bin ich grade zu blöd oder mache irgendwann kleinen Fehler.
Ich bekomme eine Fehler JSON Datei zurück. Was ich im Logcat gesehen hat, dass SESSION funktioniert hatte, aber der Post leer geblieben ist. Deswegen habe ich in der App geschaut. Zahlen stimmen schon.
Und der Post geht genauso wie mit den Strings.. Habe extra an eine Stelle in der App geschaut, wo ich das schon mal hatte. aber da ging es ja...

Mein Script:

Java:
 //Abruf die JSON Datei

        Log.e("JSON Filter", "Code: " + filter);


        RequestQueue queue = Volley.newRequestQueue(getActivity());

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, json_url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
            Log.e("JSON Filter", "Response: " + response);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getActivity(), "Filter Fehler", Toast.LENGTH_LONG).show();
                Log.e("Filter Fehler", "VolleyError: " + error);
            }
        }){
            @Nullable
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();

                param.put("filter", "" + filter);
                Log.e("JSON Filter", "Ausgang Map: " + param);
                Toast.makeText(getActivity(), "Map: " + param, Toast.LENGTH_SHORT).show();

                return param;
            }
        };

        queue.add(jsonObjectRequest);

Die URL ist richtig, sonst würde ich keine JSON erhalten, mit dem Hinweis, dass der Filter null ist. Unter Log.e("JSON Filter", "Code: " + filter); bekomme ich jedes Mal die Zahlen 1 bis 6. Standardwert ist 1 eingestellt.

Wer kenn sich aus, und weiß, wieso er nichts ans PHP sendet?

Ich danke für eure Hilfe ;)
 

Jw456

Top Contributor
Poste doch mal was genau im der Respons steht.
Den ganzen String. Ist das überhaupt ein Json.

Dann kanm Vileicht auch einer helfen.
So wahrscheinlich weniger.
 

wer112

Top Contributor
Poste doch mal was genau im der Respons steht.
Den ganzen String. Ist das überhaupt ein Json.

Dann kanm Vileicht auch einer helfen.
So wahrscheinlich weniger.
Response: {"Ankunft: ":null,"header":"Leer Filter Fehler. Filter: "}

Das Posten ist ja egal, ob String oder Json. Aber der Empfang ist nicht egal. Kann keine String Antwort mit einem Json Request empfangen.

Da ich eine Filterzahl hoch schicken muss, damit alle Transaktionen, die ein Nutzer im App Store gemacht hat, sortiert, wie dieser es will aus der Datenbank geladen werden kann..

Die Zahl ich Korrekt:

Log:

E Code: 1
2023-09-03 18:03:54.482 32508-32508 JSON Filter E Response: {"Ankunft: ":null,"header":"Leer Filter Fehler. Filter: "}
2023-09-03 18:04:00.342 32508-32508 JSON Filter E Code: 5
2023-09-03 18:04:00.615 32508-32508 JSON Filter E Response: {"Ankunft: ":null,"header":"Leer Filter Fehler. Filter: "}
 

Jw456

Top Contributor
Welche Antwort erwartest du denn vom Server?

Wenn der Server auf deinen Request nicht richtig Antwortet. Dann soltest du dort nachschauen.
 

wer112

Top Contributor
Welche Antwort erwartest du denn vom Server?
Die Zahl, die im Log.e("JSON Filter", "Code: " + filter); steht.
Da ist noch in Ordnung:

Wenn der Server auf deinen Request nicht richtig Antwortet. Dann soltest du dort nachschauen.
PHP:
$angemeldet = trim($_SESSION['angemeldet']);
$kundennummer = trim($_SESSION['kn']);

$antwortJSON = array();

if(empty($angemeldet) or empty($kundennummer)){
    $antwortJSON['header'] = "Session fehler";
    echo json_encode($antwortJSON);

}else{

    if($angemeldet == 1){
        $filter = trim($_POST['filter']);


    if(empty($filter)){
        
        $antwortJSON['header'] = "Leer Filter Fehler.";
        $antwortJSON['session'] = "Kundennummer: " . $kundennummer . ", angemeldet: " . $angemeldet;
        echo json_encode($antwortJSON);

    }else{

        switch($filter){

            case "1":
                $antwortJSON['header'] = "Filter 1";
                echo json_encode($antwortJSON);
                break;

            case "2":
                $antwortJSON['header'] = "Filter 2";
                echo json_encode($antwortJSON);
                break;

            case "3":
                $antwortJSON['header'] = "Filter 3";
                echo json_encode($antwortJSON);
                break;

            case "4":
                $antwortJSON['header'] = "Filter 4";
                echo json_encode($antwortJSON);
                break;

            case "5":
                $antwortJSON['header'] = "Filter 5";
                echo json_encode($antwortJSON);
                break;


            case "6":
                $antwortJSON['header'] = "Filter 6";
                echo json_encode($antwortJSON);
                break;

            
            default:
                $antwortJSON['header'] = "anderer Code";
                echo json_encode($antwortJSON);
                break;
        }

    }
 }else{
    $antwortJSON['header'] = "Nicht angemeldet";
    echo json_encode($antwortJSON);
 }


}

Ich bekomme garnixs in die $_POST Variable. In die getParams komme ich auch nicht rein...
Muss Am Java liegen. Da der Rest reingeht und bekomme ja von dort die Fehlermeldung rein. Also ist URL richtig, Session geht. Habe es so per Antwort auch erhalten grade:
Response: {"header":"Leer Filter Fehler.","session":"Kundennummer: 8551b100a86e, angemeldet: 1"}

Nur die POST Werte werden nicht überspielt.
 

KonradN

Super-Moderator
Mitarbeiter
Das sieht doch auch nicht korrekt aus.

Dein Client sendet JSON, also application/json.
$_POST wertet application/x-www-form-urlencoded oder application/form-data aus.

Ich bin kein PHP Experte, aber du musst da natürlich den Body selbst holen und denn dann dekodieren. Da wird es bestimmt auch irgendwelche Libraries / Frameworks geben. Schau einfach einmal, wie Du REST Services mit php schreiben kannst.

Ansonsten wäre das manuell etwas wie: Erst den Body lesen mit $rawData = file_get_contents('php://input'); um dann das zu decodieren was z.B. mittels $decodedData = json_decode($rawData, true); gehen könnte.

Der generelle Tipp hier ist aber ganz einfach: Wenn Du etwas machst, dann teste es direkt! Wenn Du einen REST Service schreibst, dann teste diesen z.B. mit postman oder einem ähnlichen Tool.
 

wer112

Top Contributor
Das sieht doch auch nicht korrekt aus.

Dein Client sendet JSON, also application/json.
$_POST wertet application/x-www-form-urlencoded oder application/form-data aus.

Ich bin kein PHP Experte, aber du musst da natürlich den Body selbst holen und denn dann dekodieren. Da wird es bestimmt auch irgendwelche Libraries / Frameworks geben. Schau einfach einmal, wie Du REST Services mit php schreiben kannst.
Du meinst Header. Ja den Muss ich damals mitgeben. Aber bei Volley musste ich das nicht mehr, da es gepostet wird. Bei Session muss man alles mitgeben an den Header. Da ein Browser es speichert und eine App kein Browser ist. Deswegen nutze ich ein Session System. Die Session geht ja, laut Response. Nur das Posten geht dort nicht. Aber bei anderen JSON Volley geht das und bei den ganzen Strings.

Ansonsten wäre das manuell etwas wie: Erst den Body lesen mit $rawData = file_get_contents('php://input'); um dann das zu decodieren was z.B. mittels $decodedData = json_decode($rawData, true); gehen könnte.
Im Logcat kann ich ja sehen, dass alles funktioniert. Ich probiere es mal mit String Request aus:

Java:
        Log.e("JSON Filter", "Code: " + filter);


        RequestQueue queue = Volley.newRequestQueue(getActivity());

        StringRequest  stringRequest = new StringRequest(Request.Method.POST, json_url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                Log.e("JSON Filter", "Response: " + response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }){
            @Nullable
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();

                    param.put("filter", filter.toString());

                return param;
            }
        };

        queue.add(stringRequest);

Was ich grade nicht verstehe, da klappt es problemlos. Response ist laut Log.e:
Code: 1
E Response: {"header":"Filter 1"}
E Code: 4
E Response: {"header":"Filter 4"}


Ich habe beim String nie einen Header benutzt und wie jetzt grade geht es dann. Beim JSON hatte ich headers für sessions verwendet, was ich ja nicht mehr brauche.


Was ist jetzt der Unterschied, warum das beim String geht und nicht beim JSoN, obwohl fast zu 99% gleich aufgebaut ist?
 

KonradN

Super-Moderator
Mitarbeiter
Was ist jetzt der Unterschied, warum das beim String geht und nicht beim JSoN, obwohl fast zu 99% gleich aufgebaut ist?
Wenn Du eine Library wie Volley nutzt, dann solltest Du verstehen, was diese macht.

JsonObjectRequest senden Parameter als JSON und erwartet als Ergebnis auch ein JSON
StringRequest sendet die Parameter als key/value Paare und das ist genau das Encoding, das Du in PHP auch erwartest.

Das ist halt etwas, das Du bei einem Webservice auch immer klar definieren solltest. Wenn Du ein JSON zurück gibst, dann sollte da auch ein entsprechender Header mitgegeben werden. Also etwas wie
header("Content-Type: application/json; charset=UTF-8");
in PHP.

Damit ist hoffentlich klar, wieso es nicht funktioniert. Denn einmal bekommt Deine php Seite etwas wie
{ "header" : "whatever" }
was Deine PHP Seite nicht auswerten kann und einmal bekommt es ein
header=whatever
was die Seite auswerten kann.

Edit: Hatte bei einem inline code die Anführungszeichen falsch. Habe ich verbessert.
 

wer112

Top Contributor
Wenn Du eine Library wie Volley nutzt, dann solltest Du verstehen, was diese macht.

JsonObjectRequest senden Parameter als JSON und erwartet als Ergebnis auch ein JSON
StringRequest sendet die Parameter als key/value Paare und das ist genau das Encoding, das Du in PHP auch erwartest.
Java:
 protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();

                param.put("filter", "" + filter);
                Log.e("JSON Filter", "Ausgang Map: " + param);
                Toast.makeText(getActivity(), "Map: " + param, Toast.LENGTH_SHORT).show();

                return param;
Kann man irgendwie nachvolliehen. Ich habe gelernt, das nur StringRequest Strings verabeiten jan und JsonObjekts nur JSON vormat, sonst crash. Aber das senden habe ich immer in Strings gesendet, das es aufs Ergebnis ankommt.
Das ist halt etwas, das Du bei einem Webservice auch immer klar definieren solltest. Wenn Du ein JSON zurück gibst, dann sollte da auch ein entsprechender Header mitgegeben werden. Also etwas wie
header("Content-Type: application/json; charset=UTF-8");
in PHP.
Ich mache ein Array und lasse das direkt als JSON Format auf dem innerern Bildschirm anzeigen und die App nimmt das und verarbeitet das, da hänge ich nie im PHP Teil einen Header dran.
Damit ist hoffentlich klar, wieso es nicht funktioniert. Denn einmal bekommt Deine php Seite etwas wie
{ "header" : "whatever" }
was Deine PHP Seite nicht auswerten kann und einmal bekommt es ein
header=whatever
Diesen Header hatte ich früher bei der JSONObjects bei Volley genommen:
Java:
{
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> header = new HashMap<>();

                header.put("Set-Cookie", sessionID);

                return header;
            }

Aber da ich kein SESSION SO mehr mitgebe, da sonst die ganzen String Anfrage ja nicht klappen, habe ich da ppar classen, die das regeln... Die mit dem CookieManager automatisch den Header bildet und damit alles übergiebt.


Werde es mal mit diesem Header probieren, obwohl ich keine SeeID als String verwende...

Ne auch mit einem Header hat es nicht funktioniert..
 

KonradN

Super-Moderator
Mitarbeiter
Das war ein Header, denn der Webservice zurück geben sollte. Es ist üblich, dass man generell mitgibt, was man sendet. Das nur als genereller Hinweis. Ich vermute, dass Volley bereits einen Header setzt, was es sendet (ohne es probiert zu haben).
 

wer112

Top Contributor
Das war ein Header, denn der Webservice zurück geben sollte. Es ist üblich, dass man generell mitgibt, was man sendet. Das nur als genereller Hinweis. Ich vermute, dass Volley bereits einen Header setzt, was es sendet (ohne es probiert zu haben).
Der Cookie Manager macht das Meiste Zeug, wie die Session Daten mitgeben und so. Bisher war nur so, das es nur um die Bearbeitung geht, da ein String Request keine JSON aufarbeiten kann oder umgekehrt. aber ich gab nie was dazu. Wenn müsste ich beim String Request auch was mitgeben bzw. zusätzlich empfangen...
Sonst muss ich das in mehrere Abfragen mit Strings machen. Bei den anderen JSON Anfragen, wird alles mit einer String Map gebastelt, die ganzen Posts... Ich will nicht die Performance im App Store in die Länge ziehen, mit 2 + Je Transaktion * 2 Anfragen, das dauert dann ewig..
 

Jw456

Top Contributor
Konrad zur Info.
Dieser Teil wird bei volley
Im header mitgegeben.
Java:
@Nullable @Override protected Map<String, String> getParams() throws AuthFailureError { HashMap<String, String> param = new HashMap<>(); param.put("filter", "" + filter); Log.e("JSON Filter", "Ausgang Map: " + param); Toast.makeText(getActivity(), "Map: " + param, Toast.LENGTH_SHORT).show(); return param; }
 

KonradN

Super-Moderator
Mitarbeiter
Ich würde jetzt doch sehr bezweifeln, dass es im Header mitgegeben wird. Das kann nur der Fall sein, wenn es urlencoded in der URL angehängt wird.

Aber bei POST ist es definitiv im Body. Und die Auswertung des Filters bei dem StringRequest zeigt das doch auch. $_POST wertet den Body aus, der application/x-www-form-urlencoded oder application/form-data kodiert sein muss. Und beim JsonObjectRequest wird im Body ein JSON erwartet.

Oder sollte ich hier etwas übersehen haben?
 

wer112

Top Contributor
Ich würde jetzt doch sehr bezweifeln, dass es im Header mitgegeben wird. Das kann nur der Fall sein, wenn es urlencoded in der URL angehängt wird.

Aber bei POST ist es definitiv im Body. Und die Auswertung des Filters bei dem StringRequest zeigt das doch auch. $_POST wertet den Body aus, der application/x-www-form-urlencoded oder application/form-data kodiert sein muss. Und beim JsonObjectRequest wird im Body ein JSON erwartet.

Oder sollte ich hier etwas übersehen haben?
Habe ein eigenen Header probiert, sowie du es gesagt hattest, hat logischerweise nicht geklappt, dass die params geschickt werden.

der Header:

Java:
        @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String,String> params = new HashMap<String, String>();
                params.put("Content-Type","application/json; charset=UTF-8");
                return params;
            }
 

KonradN

Super-Moderator
Mitarbeiter
Noch einmal ganz deutlich:
Das war ein Header, denn der Webservice zurück geben sollte. Es ist üblich, dass man generell mitgibt, was man sendet. Das nur als genereller Hinweis. Ich vermute, dass Volley bereits einen Header setzt, was es sendet (ohne es probiert zu haben).
Das ist also nichts, was Du mit Volley schicken solltest. Wenn Du in PHP JSON zurück gibst und dies UTF-8 kodiert ist, dann solltest Du diesen header setzen.

Ich bin relativ sicher, dass Volley bei den einzelnen Requests den richtigen Header setzen wird. Alles andere wäre wenig gut :)
 

Jw456

Top Contributor

Zum Thema header in volley
 

wer112

Top Contributor

Zum Thema header in volley
Dieser Header hat nixs gebracht, habe es auch mit dem Body in dem Code probiert, hat auch nicht geklappt. Ich kann das nicht aus meinen Params übergeben.

Habe das noch mal mit StringRequest gemacht, da ging das, konnte logischerweise es nicht weiter verarbeiten -> kundennumer = response.getString...

geht da nicht im Stringrequest die Funktion....

Puhh, habe es mir einfacher vorgestellt, da andere Seiten problemlos geklappt hat...
 

KonradN

Super-Moderator
Mitarbeiter
Wenn Du es als JSON übergeben willst, dann musst Du in Deiner php Seite auch genau so als json auswerten. Und genau das machst Du nicht. Das hatte ich doch erläutert.
 

wer112

Top Contributor
Wenn Du es als JSON übergeben willst, dann musst Du in Deiner php Seite auch genau so als json auswerten. Und genau das machst Du nicht. Das hatte ich doch erläutert.
Ich übergebe es als String. Ich sende eine Zahl als String auf auf den Server, er geht in den Switch und holt den richtigen Filter raus um auf die DB zuzugreifen.
Man kann mehrere Params benutzen....

Teste ob es an der Zahl liegt... (eigentlich nicht, da bei StringRequest auch klappte): Nop hat auch als Wort "zwei" nicht geklappt, wird nicht gesendet in der JSONObjectRequest... mmhhh

Ich hoffe wir bekommen das hin. Sonst muss ich den JSON im StringRequest holen und in einer Methode es schön auseinander packen. KP wie man Aus JSON Format alle Informationen in Variablen packt...

Dann Jute Nacht 👍
 

Marinek

Bekanntes Mitglied
Ich glaube das Hauptproblem ist hier, dass man mit sehr gefährlichen Halbwissen drangeht.

Ich persönlich würde hier auch nicht sinnlos raten.

Vielmehr würde ich alles protokollieren, dass den Server erreicht.
Ich kann mir vorstellen, dass wenn es via String übergeben wird, ist es ja json.

Wenn man dann Volley verwendet, und der String in json serialisiert wird, dann hat man ein String, dessen Inhalt ein json ist in json serialisiert. Garantiert ist dann alles escaped. Daher kommt das im Server falsch an.

Ansonsten sollte man sich korrekt damit beschäftigen. Hier ständig das gleiche zu posten bietet kein Mehrwert.
 

KonradN

Super-Moderator
Mitarbeiter
Er hat ja einige Details genannt. Wir sehen ja den Code, und filter ist nach seinen Aussagen nur eine Zahl.

Daher läuft es aus meiner Sicht weiterhin einfach darauf hinaus, dass er bei JsonObjectRequest im Body ein json kodierten Wert bekommt { "filter" : "5" } oder so.
Und die PHP Seite nutzt $_POST und das kann mit dem JSON Body schlicht nicht umgehen.

Aber wir drehen uns da im Kreis und ich denke, dass das Gesagte weiterhin nicht verstanden wurde, weil die http Requests schlicht nicht verstanden wurden.

Vor allem könnte man ja mit StringRequest weiter machen, wenn man den php "Service" nicht verändern möchte ...
 

Jw456

Top Contributor
Ich habe mir das Tehma nochmal angesehen.

Bist du dir sicher das du uns den richtige PHP Teil deines Script gezeigt hasst.

In den in #5 gezeigte Code und die Response in #3.
Passen nicht zusammen.

In dem php finde ich genau diese Response nicht
 

wer112

Top Contributor
Ich habe mir das Tehma nochmal angesehen.

Bist du dir sicher das du uns den richtige PHP Teil deines Script gezeigt hasst.

In den in #5 gezeigte Code und die Response in #3.
Passen nicht zusammen.

In dem php finde ich genau diese Response nicht
Doch habe alles gezeigt. kam so an.

Wenn Du es als JSON übergeben willst, dann musst Du in Deiner php Seite auch genau so als json auswerten. Und genau das machst Du nicht. Das hatte ich doch erläutert.
Ich habe im Internet auf der Seite https://stackoverflow.com/questions/29442977/volley-jsonobjectrequest-post-parameters-no-longer-work gefunden, wo die sagen, das man ja ein JSON an PHP Übergibt per JSONObject.

param geht nicht in Volley, da es ein JSON braucht für die Übergabe. Das hängt man dann in den erstenteil rein, wo bei mir null steht, nach der json_url.

Dieser JSON wird richtig gebildet.

Ich habe auf der PHP Seite ein JSON zurückgegeben, mit dem Ergebnis von der JSON, die war trotzdem leer.

Aber man kann erst es decoden, wenn man das überhaupt erst empfängt..
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe da jetzt tatsächlich noch in den Source geschaut:
volley/core/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java at master · google/volley (github.com)

Da wird tatsächlich kein Header gesetzt. Bei dem Beispiel hätte es ja sein können, dass da die Methode überschrieben wird und die Methode in JsonObjectRequest den Header bereits drin gehabt hätte.

Danke für den Hinweis, denn das war jetzt unerwartet...
Und ich war blind. Meine Erwartung war natürlich richtig und ich habe nur nicht gut genug geschaut. JsonObjectRequest erbt von JsonRequest und das setzt natürlich en content-type:
Java:
    /** Default charset for JSON request. */
    protected static final String PROTOCOL_CHARSET = "utf-8";

    /** Content type for request. */
    private static final String PROTOCOL_CONTENT_TYPE =
            String.format("application/json; charset=%s", PROTOCOL_CHARSET);

Java:
    @Override
    public String getBodyContentType() {
        return PROTOCOL_CONTENT_TYPE;
    }

Und das landet dann in den Headern. Also doch genau so, wie ich es eigentlich erwartet hatte.

Ich habe im Internet auf der Seite https://stackoverflow.com/questions/29442977/volley-jsonobjectrequest-post-parameters-no-longer-work gefunden, wo die sagen, das man ja ein JSON an PHP Übergibt per JSONObject.

param geht nicht in Volley, da es ein JSON braucht für die Übergabe. Das hängt man dann in den erstenteil rein, wo bei mir null steht, nach der json_url.
Hast Du Dir denn die entstehenden Requests einmal im Detail angesehen? Hast Du mal versucht, die php Webseite so anzupassen, dass Du alle Details mitbekommst?

In #6 hatte ich paar Hinweise gegeben, wie sowas funktionieren könnte.

Und entsprechende Hinweise gb es auch z.B. hier: Receive JSON POST with PHP - Stack Overflow

Interessant finde ich den Ansatz:
PHP:
$_POST = json_decode(file_get_contents('php://input'), true);

Wenn ich sowas lese, dann läuft es mir irgendwie kalt den Rücken runter. Wieso hat php nur den Ruf, eine Sprache für Frickler zu sein? Verstehe ich gerade irgendwie nicht :)

Ich verstehe auch nicht, wieso da in dem Thread, den der TE erwähnt hat, niemand geschrieben hat, dass $_POST nicht das JSON eines Requests auswerten kann.

Aber was mich bei Volley noch etwas irritiert: Wieso wird da getParam überschrieben? Ich sehe gerade nicht im Source von Volley, dass dies genommen word. Es sollte statt dessen ein JsonObject beim Konstruktor übergeben werden (wo derzeit null übergeben wird), denn das wird in der Methode getBody in JsonRequest verwendet. Ich sehe erst einmal nicht, dass getParams wirklich aufgerufen wird. Aber da der TE da ja entsprechend auch log Meldungen schreibt und gar ein toast zeigt, gehe ich einmal davon aus, dass dies aufgerufen wird.


Aber egal, wie dem auch immer sei: die wichtigen Dinge sind gesagt worden und ich sehe nicht, dass darauf eingegangen wurde. Daher wäre ich an dieser Stelle erst einmal aus dem Thread raus.
 

wer112

Top Contributor
So ich habe es jetzt hinbekommen, es an den Server zu senden:

Java Teil(Habe mit einer ArrayMap gemacht):

Java:
        Log.e("JSON Filter", "Code: " + filter);

        ArrayMap arrayMap = new ArrayMap();
        arrayMap.put("filter", filter.toString());

        JSONObject parameters = new JSONObject(arrayMap);

        JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, json_url, parameters, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                //TODO: handle success
                Log.e("JSON Filter", "Response: " + response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                //TODO: handle failure
            }
        });

        Volley.newRequestQueue(getActivity()).add(jsonRequest);

PHP Teil:

PHP:
$_POST = json_decode(file_get_contents('php://input'), true);
        
        $antwortJSON['filter'] = "decode: " . $_POST['filter'];
        echo json_encode($antwortJSON);

Ohne diesen Satz geht garnichts:

PHP:
$_POST = json_decode(file_get_contents('php://input'), true);

Der muss drüber stehen. Jetzt werde ich es decoden und dann den Filter weiterauszubauen.

Ich hoffe, dass alle die das gleiche Problem haben, diesen Post finden.

Das Kapitel ist geschlossen ;)
 

wer112

Top Contributor
Ist doch genau das was Konrad geich am Anfang gesagt hat.
Nicht gans, er hat nur gesagt, ich müsse ein JSON an den Server Übergeben. Er hat aber nicht gesagt, dass man getParms nicht braucht und die JSON oben beim Null hinkommt und auch den PHP Teil nicht.

Er hat was gesagt, deswegen habe ich auch gesagt, deswegen lezter Beitrag ein Like ggeben.

Ich verstehe grade fast nixs, aber Konrad meinte indirekt(sowie ich Ihn verstanden habe) dass es futch ist...
 

Jw456

Top Contributor
Das wichtigste PHP hat er gesagt.

Ob du die Parms im Konstruktor oder die Methode getParms überschreibtst kommt auf das gleiche raus.

Hauptgrund ist und war PHP.
Der Server.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Also ob man mit dem getParams überschreiben auch ein JSONObject bekommen kann oder nicht, kann ich nicht mit Sicherheit sagen. Aber es macht aus meiner Sicht wenig Sinn da es deutlich mehr Code und deutlich schlechter zu lesen ist. Und ja - der Punkt ist neu.

Aber ich habe die Kernprobleme von Anfang an angesprochen - aber leider wohl nicht in einer für Dich verständlichen Art. Für die Zukunft ist es aber bei sowas dann besser, da nachzufragen, als immer wieder die (mehr oder weniger) gleiche Frage zu bringen. Und es sollte wichtig sein, die Hintergründe zu verstehen. Das hatte ich ja auch versucht etwas zu erläutern.

Aber ich freue mich, dass es jetzt funktioniert und das Problem behoben ist.
 

Ähnliche Java Themen

Neue Themen


Oben