web-dev-qa-db-fra.com

Android JSON HttpClient pour envoyer des données à PHP serveur avec HttpResponse

J'essaie actuellement d'envoyer des données depuis une application Android vers un serveur php (les deux sont contrôlés par moi). 

Il y a beaucoup de données recueillies sur un formulaire dans l'application, cela est écrit dans la base de données. Tout cela fonctionne.

Dans mon code principal, je crée d'abord un JSONObject (je l'ai coupé ici pour cet exemple):

JSONObject j = new JSONObject();
j.put("engineer", "me");
j.put("date", "today");
j.put("fuel", "full");
j.put("car", "mine");
j.put("distance", "miles");

Ensuite, je passe l'objet pour l'envoi et reçois la réponse:

String url = "http://www.server.com/thisfile.php";
HttpResponse re = HTTPPoster.doPost(url, j);
String temp = EntityUtils.toString(re.getEntity());
if (temp.compareTo("SUCCESS")==0)
{
    Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show();
}

La classe HTTPPoster:

public static HttpResponse doPost(String url, JSONObject c) throws ClientProtocolException, IOException 
{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost request = new HttpPost(url);
    HttpEntity entity;
    StringEntity s = new StringEntity(c.toString());
    s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    entity = s;
    request.setEntity(entity);
    HttpResponse response;
    response = httpclient.execute(request);
    return response;
}

Cela obtient une réponse, mais le serveur renvoie une réponse 403 - Forbidden.

J'ai essayé de changer un peu la fonction doPost (c'est en fait un peu mieux, comme je l'ai dit, j'ai beaucoup à envoyer, essentiellement 3 du même formulaire avec des données différentes - je crée donc 3 JSONObjects, un pour chaque entrée de formulaire - les entrées proviennent de la base de données au lieu de l'exemple statique que j'utilise).

Tout d'abord, j'ai changé un peu l'appel:

String url = "http://www.myserver.com/ServiceMatalan.php";
Map<String, String> kvPairs = new HashMap<String, String>();
kvPairs.put("vehicle", j.toString());
// Normally I would pass two more JSONObjects.....
HttpResponse re = HTTPPoster.doPost(url, kvPairs);
String temp = EntityUtils.toString(re.getEntity());
if (temp.compareTo("SUCCESS")==0)
{
    Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show();
}

Ok donc les changements à la fonction doPost:

public static HttpResponse doPost(String url, Map<String, String> kvPairs) throws ClientProtocolException, IOException 
{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    if (kvPairs != null && kvPairs.isEmpty() == false) 
    {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(kvPairs.size());
        String k, v;
        Iterator<String> itKeys = kvPairs.keySet().iterator();
        while (itKeys.hasNext()) 
        {
            k = itKeys.next();
            v = kvPairs.get(k);
            nameValuePairs.add(new BasicNameValuePair(k, v));
        }             
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    }
    HttpResponse response;
    response = httpclient.execute(httppost);
    return response;
}

Ok, donc cela retourne une réponse 200

int statusCode = re.getStatusLine().getStatusCode();

Cependant, les données reçues sur le serveur ne peuvent pas être analysées comme une chaîne JSON. C'est mal formaté je pense (c'est la première fois que j'utilise JSON):

Si dans le fichier php je fais un echo sur $ _POST ['véhicule'] je reçois ce qui suit:

{\"date\":\"today\",\"engineer\":\"me\"}

Quelqu'un peut-il me dire où je me trompe ou s'il existe un meilleur moyen de réaliser ce que j'essaie de faire? Espérons que ce qui précède a un sens!

23
Scoobler

Après beaucoup de lectures et de recherches, j'ai trouvé le problème, je pense que magic_quotes_gpc est activé sur le serveur.

Ainsi, en utilisant:

json_decode(stripslashes($_POST['vehicle']));

Dans mon exemple ci-dessus, supprime les barres obliques et permet de décoder correctement le JSON.

Vous ne savez toujours pas pourquoi envoyer un StringEntity provoque une erreur 403?

11
Scoobler
StringEntity s = new StringEntity(c.toString());
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
request.setEntity(s);
4
user534737

Essayez ce code ça marche pour moi 

public void postData(String result,JSONObject obj) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);

String json=obj.toString();

try {

    HttpPost httppost = new HttpPost(result.toString());
    httppost.setHeader("Content-type", "application/json");

    StringEntity se = new StringEntity(obj.toString()); 
    se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    httppost.setEntity(se); 

    HttpResponse response = httpclient.execute(httppost);
    String temp = EntityUtils.toString(response.getEntity());
    Log.i("tag", temp);


} catch (ClientProtocolException e) {

} catch (IOException e) {
}

}

1
Sachin Gurnani

Changement

(String url = "http://www.server.com/MainPage.php";)

à

(String url = "http://www.server.com/MainPage.php?";)

Un point d'interrogation à la fin est nécessaire lorsque vous essayez d'envoyer des paramètres au script php. 

0
Sergey

Essayez ce code cela fonctionne parfaitement  

*For HttpClient class* download jar file "httpclient-4.3.6.jar" and put in libs folder then
Compile:   dependencies {compile files('libs/httpclient-4.3.6.jar')}

repositories {
        maven {
            url "https://jitpack.io"
        }
    }

appelle alors la classe HttpClient cet AsyncTask comme ceci:

la classe privée YourTask étend AsyncTask { private String error_msg = "Erreur du serveur!";

    private JSONObject response;



    @Override
    protected Boolean doInBackground(String... params) {
        try {
            JSONObject mJsonObject = new JSONObject();
            mJsonObject.put("user_id", "user name");
            mJsonObject.put("password", "123456");
            String URL=" Your Link"

            //Log.e("Send Obj:", mJsonObject.toString());

            response = HttpClient.SendHttpPost(URL, mJsonObject);
            boolean status = response != null && response.getInt("is_error") == 0; // response

            return status;
        } catch (JSONException | NullPointerException e) {
            e.printStackTrace();
            mDialog.dismiss();
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean status) {
       // your code

    }
}
0
Nur Gazi