Chaque fois que j'essaie d'utiliser la méthode POST avec Volley, j'obtiens une erreur grave. J'obtiens une valeur nulle dans getCause et une valeur par défaut dans getNetworkResponse.toString ().
Si j'utilise la méthode GET, cela fonctionne bien (je reçois une réponse de mon URL).
Quelqu'un peut-il aider que puis-je faire?
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);
Journal des erreurs:
Erreur: Erreur: com.Android.volley.ServerError >> 404 >> [B @ 42b1e0d0 >> null >> null
UPDATE: networkResponse.statusCode vient en tant que 404, bien que l'URL soit accessible (et renvoie des données si je viens d'utiliser la méthode GET). Si je supprime la partie d'en-tête dans la méthode POST, toujours le même.
l'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);
?>
Commencez par vérifier que votre serveur fonctionne correctement .. Vous pouvez utiliser Postman (plug-in chrome) ou tout autre moyen d’envoyer une demande de publication à l’URL et de voir ce qu’il répond.
Après vous être assuré qu’il n’ya pas de problème avec votre serveur, laissez-nous résoudre le problème avec volley.
Il y a un problème avec JsonObjectRequest
lorsque vous utilisez la méthode POST . Comme ceci Volley JsonObjectRequest La requête de publication ne fonctionne pas .
Je vous suggère d'utiliser StringRequest
en premier et d'écraser la méthode getParams
comme vous l'avez fait auparavant. Après avoir survécu à cette tâche, vous pouvez essayer d’écrire votre propre demande, pas très difficile, mais très utile.
Je suggère également d'ajouter request.setShouldCache(false)
avant requestQueue.add(request);
. Par défaut, volley enregistre la réponse dans son cache et ce comportement peut entraîner un problème étrange.
le problème est votre file d'attente . changez votre code de volée en ceci:
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);
et votre code php (laravel) à ceci:
$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);
Ajouter ce code avant d'ajouter à la file d'attente
request.setRetryPolicy (nouvelle règle par défaut (0, -1, par défaut).
parfois, la demande est expirée avant que votre php ne soit complètement exécuté. alors essayez ce code. peut peut-être aider
Volley ne gère pas parfaitement les paramètres de la méthode POST intégrée; vous devez donc créer une réponse personnalisée.
La réponse est publiée par Katwal-Dipak sur un autre message similaire à celui-ci. https://stackoverflow.com/a/31532955/4969957
Ce qui fonctionne parfaitement. Merci.
Eh bien, je pense que vous pouvez d’abord imprimer le responseCode dans votre logcat
c'est peut-être lié à votre opérateur ...
J'ai le même problème en envoyant JasonObject avec Volley.
J'ai testé mon application sur 9 à 10 appareils avec deux opérateurs différents.
La demande sur un opérateur renvoie une erreur contenant toutes les données vides ou vides, sur l’autre tout fonctionne correctement et j’obtiens ma réponse à partir de l’API.
Je ne sais pas du tout ce que les opérateurs font ce qui cause ce problème ........ Ils utilisent peut-être un pare-feu qui empêche l'envoi de JsonObject.