Jedes Mal, wenn ich versuche, die POST - Methode mit Volley zu verwenden, erhalte ich einen schwerwiegenden Fehler. Ich erhalte in getCause einen Nullwert und in getNetworkResponse.toString () einen Standardwert.
Wenn ich die GET-Methode verwende, funktioniert das gut (ich bekomme eine Antwort von meiner URL).
Kann jemand helfen, was kann ich tun?
Map<String, String> jsonParams = new HashMap<String, String>();
jsonParams.put("teststr", "abd");
RequestQueue requestQueue = VolleySingleton.getInstance().getRequestQueue();
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.POST,
url,
new JSONObject(jsonParams),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Toast.makeText(getApplicationContext(), "Success"+response.toString(), Toast.LENGTH_LONG).show();
}catch(Exception e){
Toast.makeText(getApplicationContext(), "JSON ERROR", Toast.LENGTH_LONG).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("abd", "Error: " + error
+ ">>" + error.networkResponse.statusCode
+ ">>" + error.networkResponse.data
+ ">>" + error.getCause()
+ ">>" + error.getMessage());
}
}) {
@Override
protected Map<String,String> getParams() {
HashMap<String, String> params = new HashMap<String, String>();
params.put("key", "value");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
requestQueue.add(request);
Fehlerprotokoll:
Error: Fehler: com.Android.volley.ServerError >> 404 >> [B @ 42b1e0d0 >> null >> null
UPDATE: networkResponse.statusCode kommt als 404, obwohl auf die URL zugegriffen werden kann (und wenn ich nur die GET-Methode verwende, Daten zurückgeben). Wenn ich den Header-Teil in der POST -Methode entferne, bleibt derselbe.
die URL:
<?php
$response = array();
$jsonString = file_get_contents('php://input');
$jsonObj = json_decode($jsonString, true);
if(!isset($jsonObj['teststr'])){
$response["msg"] = "No data.";
}else{
$response["msg"] = "Success: ".$jsonObj['teststr'];
}
echo json_encode($response);
?>
Stellen Sie zunächst sicher, dass Ihr Server einwandfrei funktioniert. Sie können Postman (Chrome-Plug-In) oder eine andere Möglichkeit verwenden, um eine Post-Anfrage an die URL zu senden und zu sehen, was er antwortet.
Nachdem Sie sichergestellt haben, dass kein Problem mit Ihrem Server vorliegt, lösen Sie das Problem mit Volley.
Es gibt ein Problem mit JsonObjectRequest
, wenn Sie POST Methode . Wie folgt verwenden Volley JsonObjectRequest Post-Anforderung funktioniert nicht .
Ich schlage vor, dass Sie zuerst StringRequest
verwenden und die getParams
-Methode wie zuvor überschreiben. Nachdem Sie diese Aufgabe überlebt haben, können Sie versuchen, Ihre eigene Anfrage zu schreiben, nicht sehr schwierig, aber sehr nützlich.
Ich empfehle außerdem, request.setShouldCache(false)
vor requestQueue.add(request);
hinzuzufügen. Volley speichert die Antwort standardmäßig in seinem Cache, und dieses Verhalten kann zu merkwürdigen Problemen führen.
problem ist Ihre Queue . Ändern Sie Ihren Volley-Code folgendermaßen:
RequestQueue queue = Volley.newRequestQueue(this);
String URL = EndPoints.BASE_URL + "/call";
StringRequest request = new StringRequest(Request.Method.POST, URL,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
Log.d("onResponse", response);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
NetworkResponse response = error.networkResponse;
String errorMsg = "";
if(response != null && response.data != null){
String errorString = new String(response.data);
Log.i("log error", errorString);
}
}
}
) {
@Override
protected Map<String, String> getParams()
{
Map<String, String> params = new HashMap<String, String>();
params.put("key_1","value_1");
params.put("key_2", "value_2");
Log.i("sending ", params.toString());
return params;
}
};
// Add the realibility on the connection.
request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0f));
// Start the request immediately
queue.add(request);
und dein ph (laravel) code dazu:
$response['success'] = true;
$response['user']['tell'] = $user->tell;
$response['user']['code'] = $user->code;
$response['user']['time'] = $time;
$response['user']['register_state'] = '1'
return response()->json($response, 200);
Fügen Sie diesen Code vor dem Hinzufügen zur Warteschlange hinzu
request.setRetryPolicy (new DefaultRetryPolicy (0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
manchmal wird die Zeit abgelaufen, bevor der PHP-Vorgang vollständig ausgeführt wird. versuchen Sie es also mit diesem Code. vielleicht kann helfen
Ich habe versucht, die Antwort als String anzuzeigen, und der Fehler ist aufgetreten.
Verwenden Sie response.toString()
, wo immer Sie den Fehler anzeigen oder verwenden möchten.
Volley verarbeitet eingebaute POST - Methodenparameter nicht perfekt, daher müssen Sie eine benutzerdefinierte Antwort erstellen.
Die Antwort wird von katwal-Dipak in einem ähnlichen Beitrag ähnlich angezeigt. https://stackoverflow.com/a/31532955/4969957
Welches funktioniert perfekt. Danke.
Nun, ich denke, Sie können den ResponseCode zuerst in Ihrem Logcat ausdrucken
vielleicht hängt es mit Ihrem Operator zusammen ...
Ich habe das gleiche Problem beim Senden von JasonObject mit Volley.
Ich habe meine App auf 9-10 Geräten mit zwei verschiedenen Betreibern getestet.
Die Anfrage für einen Operator gibt einen Fehler mit allen leeren oder leeren Daten zurück, zum anderen funktioniert alles einwandfrei und ich bekomme meine Antwort von der API erfolgreich.
Ich habe keine Ahnung, was Operatoren tun, die dieses Problem verursachen ... Vielleicht verwenden sie eine Art Firewall, die das Senden von JsonObject blockiert.