webentwicklung-frage-antwort-db.com.de

Volley JsonObjectRequest Post-Parameter funktionieren nicht mehr

Ich versuche, POST -Parameter in einem Volley JsonObjectRequest zu senden. Zunächst war es funktionierte für mich, indem ich den Anweisungen des offiziellen Codes folgte, in denen ein JSONObject übergeben wird, das die Parameter im Konstruktor von JsonObjectRequest enthält. Dann hörte es plötzlich auf zu funktionieren und ich habe keine Änderungen an dem Code vorgenommen, der zuvor funktioniert hat. Der Server erkennt nicht mehr, dass POST -Parameter gesendet werden. Hier ist mein Code:

RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://myserveraddress";

// POST parameters
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");

JSONObject jsonObj = new JSONObject(params);

// Request a json response from the provided URL
JsonObjectRequest jsonObjRequest = new JsonObjectRequest
        (Request.Method.POST, url, jsonObj, new Response.Listener<JSONObject>()
        {
            @Override
            public void onResponse(JSONObject response)
            {
                Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_SHORT).show();
            }
        },
        new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
            }
        });

// Add the request to the RequestQueue.
queue.add(jsonObjRequest);

Hier ist der einfache Tester PHP Code auf dem Server:

$response = array("tag" => $_POST["tag"]);
echo json_encode($response);

Die Antwort, die ich erhalte, ist {"tag":null}
Gestern hat es gut funktioniert und hat mit {"tag":"test"} geantwortet.
Ich habe nichts geändert, aber heute funktioniert es nicht mehr.

Im Volley-Quellcode-Konstruktor Javadoc heißt es, dass Sie ein JSONObject im Konstruktor übergeben können, um die Post-Parameter an "@param jsonRequest" zu senden: https://Android.googlesource.com/platform/frameworks/volley/ +/master/src/main/Java/com/Android/Volley/Werkzeugkasten/JsonObjectRequest.Java

/ **
* Erstellt eine neue Anfrage.
* @param-Methode die zu verwendende HTTP-Methode
* @param url URL, von der die JSON abgerufen werden soll
* @param jsonRequest Ein {@link JSONObject}, das mit der Anforderung gepostet werden soll. Null ist erlaubt und
* Zeigt an, dass keine Parameter zusammen mit der Anfrage veröffentlicht werden.

Ich habe andere Beiträge mit ähnlichen Fragen gelesen, aber die Lösungen haben für mich nicht funktioniert:

Volley JsonObjectRequest Post-Anfrage funktioniert nicht

Volley Post JsonObjectRequest ignoriert Parameter bei der Verwendung von getHeader und getParams

Volley sendet keine Post-Anfrage mit Parametern.

Ich habe versucht, das JSONObject im JsonObjectRequest-Konstruktor auf null zu setzen, die Parameter in den Methoden "getParams ()", "getBody ()" und "getPostParams ()" zu überschreiben und festzulegen, aber keine dieser Überschreibungen hat funktioniert mir. Ein anderer Vorschlag war die Verwendung einer zusätzlichen Hilfsklasse, die im Wesentlichen eine benutzerdefinierte Anforderung erstellt. Diese Korrektur ist jedoch für meine Anforderungen zu komplex. Wenn es darauf ankommt, werde ich alles tun, damit es funktioniert. Aber ich hoffe, dass es einen einfachen Grund gibt, warum mein Code war funktioniert und dann einfach gestoppt und auch eine einfache Lösung.

26
Joshua C.

Ich habe stattdessen Volleys StringRequest verwendet, weil ich zu viel wertvolle Zeit damit verbracht hatte, JsonObjectRequest zum Laufen zu bringen.

RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://myserveraddress";

StringRequest strRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error)
                    {
                        Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
                    }
                })
        {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String> params = new HashMap<String, String>();
                params.put("tag", "test");
                return params;
            }
        };

queue.add(strRequest);

Das hat bei mir funktioniert. Es ist genauso einfach wie JsonObjectRequest, verwendet jedoch stattdessen einen String.

32
Joshua C.

Sie müssen nur ein JSONObject aus Ihrer HashMap von Parametern erstellen:

String url = "https://www.youraddress.com/";

Map<String, String> params = new HashMap();
params.put("first_param", 1);
params.put("second_param", 2);

JSONObject parameters = new JSONObject(params);

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

Volley.newRequestQueue(this).add(jsonRequest);
33
Philippe

Ich hatte ein ähnliches Problem, stellte jedoch fest, dass das Problem nicht auf der Clientseite, sondern auf der Serverseite lag. Wenn Sie eine JsonObject senden, müssen Sie das POST - Objekt wie folgt erhalten (auf der Serverseite):

In PHP:

$json = json_decode(file_get_contents('php://input'), true);
10

Sie können StringRequest verwenden, um dieselben Funktionen wie JsonObjectRequest auszuführen, während Sie dennoch problemlos POST Parameter senden können. Das einzige, was Sie tun müssen, ist ein JsonObject aus dem Request-String zu erstellen, den Sie erhalten, und von dort aus können Sie fortfahren, als ob es JsonObjectRequest wäre.

StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //Creating JsonObject from response String
                            JSONObject jsonObject= new JSONObject(response.toString());
                            //extracting json array from response string
                            JSONArray jsonArray = jsonObject.getJSONArray("arrname");
                            JSONObject jsonRow = jsonArray.getJSONObject(0);
                            //get value from jsonRow
                            String resultStr = jsonRow.getString("result");
                        } catch (JSONException e) {

                        }

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> parameters = new HashMap<String,String>();
                        parameters.put("parameter",param);

                        return parameters;
                    }

                };
                requestQueue.add(stringRequest);
7
itamar8910

Die Verwendung des JSONObject-Objekts zum Senden von Parametern bedeutet, dass die Parameter im HTTP POST -Anforderungshauptteil im JSON-Format vorliegen:

Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");
params.put("tag2", "test2");
JSONObject jsonObj = new JSONObject(params);

Erstellt dieses JSON-Objekt und fügt es in den Hauptteil der HTTP-Anforderung POST ein:

{"tag":"test","tag2":"test2"}

Dann muss der Server den JSON dekodieren, um diese POST -Parameter zu verstehen.

Normalerweise schreiben HTTP POST - Parameter in den Körper wie:

tag=test&tag2=test2

Aber jetzt ist die Frage, warum Volley auf diese Weise eingestellt ist.

Ein Server, der eine HTTP-Methode POST liest, sollte standardmäßig immer versuchen, Parameter auch in JSON (außer in Klartext) zu lesen. Ein Server, der dies nicht durchführt, ist ein fehlerhafter Server.

Oder ein HTTP POST - Body mit Parametern in JSON ist nicht das, was normalerweise ein Server will?

Ich hatte ein ähnliches Problem. Aber ich habe herausgefunden, dass das Problem nicht auf der Serverseite lag, sondern das Problem des Cache. Sie müssen Ihren RequestQueue-Cache löschen. 

RequestQueue requestQueue1 = Volley.newRequestQueue(context);
requestQueue1.getCache().clear();
1

Könnte jemandem helfen und Ihnen Zeit sparen, wenn Sie nachdenken ... Ich hatte ein ähnliches Problem, der Servercode suchte nach dem Content-Type-Header. Es hat so gemacht:

if($request->headers->content_type == 'application/json' ){ //Parse JSON... }

Aber Volley schickte den Header so:

'application/json; charset?utf-8'

Den Servercode dahingehend zu ändern hat den Trick:

if( strpos($request->headers->content_type, 'application/json') ){ //Parse JSON... 
1
kuffel

Verwenden Sie die Helper-Klasse CustomJsonObjectRequest, die here genannt wird.

und so umsetzen -

CustomJsonObjectRequest request = new CustomJsonObjectRequest(Method.POST, URL, null, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        Toast.makeText(getActivity(), response.toString(), Toast.LENGTH_SHORT).show();
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Toast.makeText(getActivity(), "Error.", Toast.LENGTH_SHORT).show();
    }
}) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        params.put("id", id);
        params.put("password", password);
        return params;
    }
};
VolleySingleton.getInstance().addToRequestQueue(request);
1
Faiz Siddiqui

Sie können es so machen:

CustomRequest request = new CustomRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
           // Toast.makeText(SignActivity.this, response.toString(), Toast.LENGTH_SHORT).show();

            Log.d("response",""+response.toString());

            String status =  response.optString("StatusMessage");
            String actionstatus = response.optString("ActionStatus");
            Toast.makeText(SignActivity.this, ""+status, Toast.LENGTH_SHORT).show();
            if(actionstatus.equals("Success"))
            {
                Intent i = new Intent(SignActivity.this, LoginActivity.class);
                startActivity(i);
                finish();
            }
            dismissProgress();

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(SignActivity.this, "Error."+error.toString(), Toast.LENGTH_SHORT).show();
            Log.d("response",""+error.toString());
            dismissProgress();
        }
    }) {
        @Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded; charset=UTF-8";
        }

        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Email", emailval);
            params.put("PassWord", passwordval);
            params.put("FirstName", firstnameval);
            params.put("LastName", lastnameval);
            params.put("Phone", phoneval);
            return params;
        }

    };
    AppSingleton.getInstance(SignActivity.this.getApplicationContext()).addToRequestQueue(request, REQUEST_TAG);

wie in CustomRequest unter dem Link beschrieben Volley JsonObjectRequest Post-Anfrage funktioniert nicht

1
Vishal

Es funktioniert.
Ich analysierte die Json-Objekt-Antwort mit dem folgenden Befehl: - Arbeitet wie ein Zauber.

String  tag_string_req = "string_req";
        Map<String, String> params = new HashMap<String, String>();
        params.put("user_id","CMD0005");

        JSONObject jsonObj = new JSONObject(params);
String url="" //your link
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                url, jsonObj, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d("responce", response.toString());

                try {
                    // Parsing json object response
                    // response will be a json object
                    String userbalance = response.getString("userbalance");
Log.d("userbalance",userbalance);
                    String walletbalance = response.getString("walletbalance");
                    Log.d("walletbalance",walletbalance);

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),
                            "Error: " + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();

            }
        });

        AppControllerVolley.getInstance().addToRequestQueue(jsonObjReq, tag_string_req);

viel Glück! Gute Nacht!

0
Debasish Ghosh