Tout en essayant d’analyser json string avec Android, les valeurs HTML sont transmises . Avant un jour, tout fonctionnait bien et, tout à coup, mon application se bloque lorsque je tente de récupérer la base de données à l’aide de fichiers php.
Quand j’ai vérifié, j’ai remarqué que les valeurs html .. Voir logcat
08-10 01:09:55.814: E/result(6744): <html><body><h2>Checking your browser..<h2><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.Push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("7965e114a1dccaf35af3756261f75ad8");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";location.href="http://realroom.byethost24.com/medical/stokist.php?ckattempt=1";</script></body></html>
08-10 01:09:55.814: E/JSON Parser(6744): Error parsing data org.json.JSONException: Value <html><body><h2>Checking of type Java.lang.String cannot be converted to JSONObject
08-10 01:09:55.816: E/AndroidRuntime(6744): FATAL EXCEPTION: AsyncTask #1
08-10 01:09:55.816: E/AndroidRuntime(6744): Process: com.example.medionline, PID: 6744
08-10 01:09:55.816: E/AndroidRuntime(6744): Java.lang.RuntimeException: An error occured while executing doInBackground()
08-10 01:09:55.816: E/AndroidRuntime(6744): at Android.os.AsyncTask$3.done(AsyncTask.Java:304)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Java.util.concurrent.FutureTask.finishCompletion(FutureTask.Java:355)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Java.util.concurrent.FutureTask.setException(FutureTask.Java:222)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Java.util.concurrent.FutureTask.run(FutureTask.Java:242)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.Java:231)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1112)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:587)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Java.lang.Thread.run(Thread.Java:818)
08-10 01:09:55.816: E/AndroidRuntime(6744): Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String org.json.JSONObject.toString()' on a null object reference
08-10 01:09:55.816: E/AndroidRuntime(6744): at com.example.medionline.All_supplier_list$FetchMFG.doInBackground(All_supplier_list.Java:182)
08-10 01:09:55.816: E/AndroidRuntime(6744): at com.example.medionline.All_supplier_list$FetchMFG.doInBackground(All_supplier_list.Java:1)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Android.os.AsyncTask$2.call(AsyncTask.Java:292)
08-10 01:09:55.816: E/AndroidRuntime(6744): at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
08-10 01:09:55.816: E/AndroidRuntime(6744): ... 4 more
Cela se produit pour toutes les pages que j'ai hébergées sur le serveur byethost, alors que les pages hébergées sur un autre serveur fonctionnent bien. J'ai essayé de déplacer l'un de mes fichiers sur un autre serveur et sur celui-ci, il renvoie la chaîne json appropriée.
De plus, lorsque je vérifie l'URL dans le navigateur, il renvoie la chaîne JSON correcte sans exception ni erreur avec byethost .. mais dans Android en donnant des valeurs html ..
Voici ma classe JSONfunction
package com.example.medionline;
import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.io.UnsupportedEncodingException;
import Java.util.List;
import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.NameValuePair;
import org.Apache.http.client.ClientProtocolException;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.entity.UrlEncodedFormEntity;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.client.utils.URLEncodedUtils;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import Android.util.Log;
public class JSONfunctions
{
static InputStream is = null;
static String result = "";
static JSONObject jArray = null;
public static JSONObject getJSONfromURL(String url)
{
// Download JSON data from URL
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httppost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 ");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
catch (Exception e)
{
Log.e("log_tag", "Error in http connection " + e.toString());
}
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
Log.e("jsonnnnnnn", line);
sb.append(line + "\n");
}
is.close();
result = sb.toString();
Log.e("result", result);
}
catch (Exception e)
{
Log.e("log_tag", "Error converting result " + e.toString());
}
try
{
jArray = new JSONObject(result);
}
catch (JSONException e)
{
Log.e("log_tag", "Error parsing data " + e.toString());
}
return jArray;
}
public static JSONObject makeHttpRequest(String loginUrl, String post, List<NameValuePair> para)
{
try
{
if(post == "POST")
{
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(loginUrl);
httpPost.setEntity(new UrlEncodedFormEntity(para));
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 ");
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
else if(post == "GET")
{
HttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(para, "utf-8");
loginUrl += "?" + paramString;
HttpGet httpGet = new HttpGet(loginUrl);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
if (is != null)
{
while ((line = reader.readLine()) != null)
{
//Log.e("jsonnnnnnn", line);
sb.append(line + "\n");
}
is.close();
result = sb.toString();
Log.e("result", result);
}
}
catch (Exception e)
{
Log.e("Buffer Error", "Error converting result " + e.toString());
}
try
{
jArray = new JSONObject(result);
}
catch (JSONException e)
{
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return jArray;
}
}
Et voici mon fichier PHP
<?php
include('config.php');
date_default_timezone_set("Asia/Calcutta");
$result1 = mysqli_query($con,"SELECT *
FROM `pj_medionline_mst_stockist`
ORDER BY `pj_medionline_mst_stockist`.`ID` ASC ");
$response = array();
$posts = array();
while($row=mysqli_fetch_array($result1))
{
$id =$row["ID"];
$stkcode =$row["stkcode"];
$comName =$row["ComName"];
$operatorid =$row["operatorid"];
$password =$row["Password"];
$posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password);
}
$response['stokist'] = $posts;
print(json_encode($response));
?>
Je devrais ajouter ce qui suit comme réponse car il s’agit de la solution de contournement pour contourner le problème ci-dessus. Publier comme cela pourrait aider quelqu'un:
Ce problème peut être résolu en écrivant simplement exit (); dans le fichier php à la dernière instruction exécutable. Cela va quitter le fichier php et ne va pas ajouter le texte .
<?php
include('config.php');
date_default_timezone_set("Asia/Calcutta");
$result1 = mysqli_query($con,"SELECT *
FROM `pj_medionline_mst_stockist`
ORDER BY `pj_medionline_mst_stockist`.`ID` ASC ");
$response = array();
$posts = array();
while($row=mysqli_fetch_array($result1))
{
$id =$row["ID"];
$stkcode =$row["stkcode"];
$comName =$row["ComName"];
$operatorid =$row["operatorid"];
$password =$row["Password"];
$posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password);
}
$response['stokist'] = $posts;
print(json_encode($response));
exit();
?>
Résolu!
J'ai eu le même problème en utilisant Byethost pour récupérer les données JSON de mon serveur PHP. Nous avons juste besoin d'ajouter un cookie à la requête HTTP pour passer le testcookie-nginx-module
Comme le dit réponse de Richard:
Le principal problème est que Byet Host implémente un module simple de sécurité anti-virus> nommé testcookie-nginx-module
Sur le lien qu'il a fourni, nous pouvons voir que le testcookie-nginx-module effectue une validation en 2 étapes:
Voici le script que j'ai reçu de mon serveur:
<html>
<body>
<script type="text/javascript" src="/aes.js" ></script>
<script>
function toNumbers(d){
var e=[];
d.replace(/(..)/g,function(d){
e.Push(parseInt(d,16))});
return e
}
function toHex(){
for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)
e+=(16>d[f]?"0":"")+d[f].toString(16);
return e.toLowerCase()
}
var a=toNumbers("f655ba9d09a112ffff8c63579db590b4"),
b=toNumbers("98344c2eee86c3ffff90592585b49f80"),
c=toNumbers("1286963467aa92ffff8323bdca0d7be9");
document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";
location.href="http://myserver.byethost8.com/myPhpPage.php?i=1";
</script>
<noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript>
</body>
Sur les demandes HTTP suivantes, le client aura stocké le cookie et l'ajoutera à la demande en ignorant l'étape 1.
Solution pour notre application Android
Nous allons ignorer la génération de cookies en le récupérant à partir d'un navigateur Web et en l'ajoutant directement à notre requête HTTP Android (à moins bien sûr que vous souhaitiez vous impliquer dans sa création).
Avant d’obtenir le cookie du navigateur Web, assurez-vous d’avoir accédé à l’URL au moins une fois avec le navigateur pour le générer.
Obtenir la clé de cookie à partir du navigateur Web. J'ai utilisé Google Chrome pour cela:
Définir le cookie sur notre application Android. Sur votre code devrait être quelque chose comme:
try
{
if(post == "POST")
{
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(loginUrl);
httpPost.setEntity(new UrlEncodedFormEntity(para));
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 ");
httpPost.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/");
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
else if(post == "GET")
{
HttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(para, "utf-8");
loginUrl += "?" + paramString;
HttpGet httpGet = new HttpGet(loginUrl);
httpGet.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/");
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
}
Et c'est tout. Désormais, chaque fois que l'application envoie une requête HTTP, elle inclut le cookie permettant de transmettre le testcookie-nginx-module et récupère vos données JSON.
J'espère que cela aide et qu'il n'est pas trop tard.
Cordialement
Le principal problème est que Byet Host implémente un module de sécurité simple, appelé testcookie-nginx-module
https://kyprizel.github.io/testcookie-nginx-module/
Cela fait planter votre application
Ceci est une fonctionnalité nouvellement introduite de détection de bots sur l'hébergement gratuit pour empêcher les robots indésirables. Cela n'apparaît que lors de la première visite sur la page.
Par exemple, /upper_respiratory_infection.htm?ckattempt=1 a été enregistré 37 fois par mes analyses Web entre le 8 et le 11 août. Il cause des ravages dans mes analyses Web puisque je collecte actuellement deux ensembles de données pour chaque page un sans CKattempt = 1, et quelques-uns portant même le complément CKattempt = 2)
Cela ne peut pas être supprimé malheureusement