J'utilise la bibliothèque Volley dans mon projet et j'obtiens Unexpected response code 500
comme réponse.
J'ai effectué une recherche approfondie sur stackoverflow et je ne parviens toujours pas à trouver une solution qui fonctionne.
Voici mon code pour faire une demande de chaîne GET
val API = "http://squadtechsolution.com/Android/v1/allcompany.php"
val requestQueue = Volley.newRequestQueue(mActivity)
val stringRequest = StringRequest(
Request.Method.GET,
API,
Response.Listener { response ->
Log.i("dxdiag", response)
mView.onFetchHttpDataResult(true)
Toast.makeText(context, response, Toast.LENGTH_LONG).show()
},
Response.ErrorListener { error ->
Toast.makeText(context, error.toString(), Toast.LENGTH_LONG).show()
Log.i("dxdiag", error.printStackTrace().toString())
mView.onFetchHttpDataResult(false)
})
requestQueue.add(stringRequest)
Voici le stacktrace
2019-09-03 17:15:53.237 3308-3892/com.squadtechs.markhor.foodapp
E/Volley: [194] BasicNetwork.performRequest: Unexpected response code
500 for
http://squadtechsolution.com/Android/v1/allcompany.php
2019-09-03 17:15:53.243 3308-3351/com.squadtechs.markhor.foodapp
D/EGL_emulation: eglMakeCurrent: 0xa7d84180: ver 2 0 (tinfo
0xa7d832b0)
2019-09-03 17:15:53.256 3308-3308/com.squadtechs.markhor.foodapp
W/System.err: com.Android.volley.ServerError
2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp
W/System.err: at com.Android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.Java:205)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err: at com.Android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.Java:131)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err: at com.Android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.Java:111)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err: at com.Android.volley.NetworkDispatcher.run(NetworkDispatcher.Java:90)
Ce qui suit est PHP code que j'ai écrit côté serveur:
<?php
require 'db.php';
$sql = "SELECT * FROM `company_profile`";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$id=$row['id'];
$company_name=$row['company_name'];
$cuisine=$row['cuisine'];
$conpany_phone=$row['conpany_phone'];
$company_description=$row['company_description'];
$company_logo=$row['company_logo'];
$company_type=$row['company_type'];
$delivery_type=$row['delivery_type'];
$delivery_range=$row['delivery_range'];
$delivery_fee=$row['delivery_fee'];
$delivery_pickupinfo=$row['delivery_pickupinfo'];
$address=$row['address'];
$companyData[] = array('id'=> $id,'company_name'=>
$company_name,'cuisine'=> $cuisine,'conpany_phone'=>
$conpany_phone,'company_description'=>
$company_description,'company_logo'=> $company_logo,'company_type'=>
$company_type,'delivery_type'=> $delivery_type,'delivery_range'=>
$delivery_range,'delivery_fee'=>
$delivery_fee,'delivery_pickupinfo'=> $delivery_pickupinfo,'address'=> $address);
}
echo $jsonformat=json_encode($companyData);
} else {
echo "0 results";
}
$conn->close();
?>
J'ai un peu modifié le code et l'ai vérifié dans Postman, ça fonctionne bien.
J'ai déplacé la déclaration d'encodage JSON de l'instruction if.
// output data of each row
while($row = $result->fetch_assoc()) {
$id=$row['id'];
$company_name=$row['company_name'];
$cuisine=$row['cuisine'];
$conpany_phone=$row['conpany_phone'];
$company_description=$row['company_description'];
$company_logo=$row['company_logo'];
$company_type=$row['company_type'];
$delivery_type=$row['delivery_type'];
$delivery_range=$row['delivery_range'];
$delivery_fee=$row['delivery_fee'];
$delivery_pickupinfo=$row['delivery_pickupinfo'];
$address=$row['address'];
$companyData[] = array('id'=> $id,'company_name'=>
$company_name,'cuisine'=> $cuisine,'conpany_phone'=>
$conpany_phone,'company_description'=>
$company_description,'company_logo'=> $company_logo,'company_type'=>
$company_type,'delivery_type'=> $delivery_type,'delivery_range'=>
$delivery_range,'delivery_fee'=>
$delivery_fee,'delivery_pickupinfo'=> $delivery_pickupinfo,'address'=> $address);
}
echo $jsonformat=json_encode($companyData);
$conn->close();
Code d'état HTTP 500
représente le internal server error
, indique clairement que vous n'avez aucun problème côté client (ici dans votre cas Volly
) mais le problème est côté serveur. Essayez de déboguer votre code php côté serveur. le code ne s'exécute pas correctement et retourne donc le 500 internal server error
dans l'en-tête de réponse Http. Volly
vient de jeter l'en-tête reçu comme une erreur.
Si vous êtes développeur backend, essayez-le d'abord avec REST Clients
avant l'intégration avec l'application mobile. Vous pouvez en obtenir un de ici . Votre API doit être bien testée et doit être dans un état de fonctionnement sinon vous recevrez des erreurs tout le temps.
J'ai quelque chose Importez d'abord le okhttp dans la dépendance Gradle (bibliothèque). voici la documentation
https://square.github.io/okhttp/
Après avoir ouvert le facteur et cliquez sur le menu de code
Comme vous pouvez le voir sous le bouton d'envoi, le bouton de code est là. cliquez dessus et sélectionnez Java-> okhttp
copiez le code et collez-le à l'intérieur Android studio. il a 99,9% de chances que cela fonctionne.
Essayez d'inclure dans votre fichier php:
header('Content-Type: application/json');
header("Access-Control-Allow-Origin: *");
Je ne suis pas familier avec Kotlin mais cela fonctionne bien pour moi en utilisant Java, voici le code:
private void loadRecyclerViewData2(){
URR_DATA="http://squadtechsolution.com/Android/v1/allcompany.php";
StringRequest stringRequest = new StringRequest(Request.Method.GET,
URR_DATA,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
System.out.println("****"+response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("***"+error.getMessage()); }
});
requestQueue = Volley.newRequestQueue(Home.this);
requestQueue.add(stringRequest);
}
Et j'obtiens la sortie suivante:
I/System.out: ****
[{"id":"1","company_name":"ABC","cuisine":"QATAR","conpany_phone":"4535345","company_description":"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut ","company_logo":"company_logo5d80bac690f2e.png","company_type":"Food","delivery_type":"yes","delivery_range":"55","delivery_fee":"","delivery_pickupinfo":"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, ","address":"33.58539655788556,71.43779296427965"}]
Votre problème vient probablement de ContentType
vous ajoutez ceci:
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded";
}
ou
return "application/json"
Si le problème ne résout pas, vous devez utiliser JsonObjectRequest
Veuillez vérifier si tous les paramètres que vous essayez d'envoyer sont les mêmes que ceux attendus par le serveur. Des paramètres erronés ou manquants renvoient également une erreur de 500. Revérifiez ce paramètre Company_mobile
dans votre demande. J'espère que cela résout votre problème.
@Muhammad Faizan ignore vos doutes, le problème IS
une erreur de serveur 500
CECI IS LA CAUSE
or
B) il y a un paramètre d'environnement que cela exposePOUR DIAGNOSTIQUER UN PHP ISSUE
et vous devez ouvrir votre error_log
sur php. En fonction de votre serveur, il peut être difficile d'expliquer comment l'autre manière consiste à modifier le php.ini
à error_log pour ce faire, essayez ceci SUR LE SERVEUR
/*This always works for me:*/
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
/*However, this doesn't make PHP to show parse errors - the only way to show those errors is to modify your php.ini with this line:*/
display_errors = on
/*(if you don't have access to php.ini, then putting this line in .htaccess might work too):*/
php_flag display_errors 1
POUR DIAGNOSTIQUER UN PROBLÈME D'ENVIRONNEMENT SUR LE SERVEUR
Si la error_log
ne donne rien essayez le access_log
. Pourquoi? Parce qu'il montrera probablement qu'un autre type de demande est entré. Et POSTMAN et VOLLEY ne sont pas les mêmes
Vous devez regarder votre access_log
trop potentiellement et regardez-le en temps réel lorsque vous cliquez sur facteur puis sur le client de volley
FAITS: (pourquoi nous pouvons être si sûrs)
Mon instinct dit que vous avez un problème dans un serveur mal configuré. Croyez-le ou non, access_log vous aidera le plus si c'est le cas.
Quoi qu'il en soit: il y a clairement un problème entre ce que vous mettez dans POSTMAN et ce que votre client de volley envoie - c'est la cause de cela.
Les choses que j'ai vues à cause de cela incluent:
SAME Origin
Erreur.INTERNAL SERVER REDIRECT
problème.no-redirect
et le manque de sécurité.mais sans nous dire la plate-forme ou le serveur (Windows? Linux? nginx? php-fpm? apache? etc) nous ne pouvons pas vous aider sur ces
Je poste une autre réponse si elle n'est toujours pas résolue. Dans le facteur, copiez tous les en-têtes comme
.addHeader("content-type", "application/json")
.addHeader("cache-control", "no-cache")
.addHeader("postman-token", "fa72f792-c9d3-7891-a544-f37f634f6ee1")
et mettre ça dans les param volly
Vérifiez votre fichier db.php
Puis voyez la variable qui retourne l'objet de connexion.
Je vois que cela devrait être $con->close()
avec un n pas $conn->close()
avec double n
Les codes d'état HTTP commençant par 5 indiquent que l'erreur est du côté serveur. Le code 500 est interprété comme une erreur de serveur interne, pour résoudre ce problème, vous devez vérifier ce qui pourrait en être la cause. Cela peut être dû à une erreur dans le code, dans ce cas, vous pouvez ouvrir votre error_log pour voir l'erreur et agir en conséquence.
Cela peut être dû au fait que les fonctionnalités du serveur ne sont pas disponibles momentanément, comme l'accès à la base de données ou que de nombreuses connexions ouvertes simultanément dépassent les ressources mysql associées.
Parfois, l'erreur n'est pas enregistrée dans le fichier error_log. Si vous utilisez un cpanel, sur la page d'accueil, sous l'onglet Métriques, ouvrez Erreurs et vérifiez en fonction de l'heure que vous avez demandée au serveur. Si vous n'utilisez pas cpanel, recherchez un journal de serveur correspondant.
suivez cette bonne réponse Réponse .. cela peut vous aider
Comment faire face à une réponse inattendue 500 dans Android
Cette erreur "500" signifie une erreur côté serveur. Ces erreurs se produisent dans les cas suivants: -
Vérifiez ces conditions. J'ai également rencontré le même problème. Les API fonctionnent sur Post Man mais ne fonctionnent pas sur les appareils utilisant Volley. J'espère que cela peut vous aider.