2010-03-29 8 views
23

Je suis actuellement en train d'essayer d'envoyer des données de et l'application Android à un serveur php (les deux sont contrôlés par moi).Android HttpClient JSON pour envoyer des données au serveur PHP avec HttpResponse

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

Dans mon code principal, d'une part créer 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 sur pour envoyer et recevoir 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 un 40 3 - Réponse interdite. J'ai essayé de changer un peu la fonction de doPost (c'est en fait un peu mieux, comme je l'ai dit j'ai beaucoup à envoyer, fondamentalement 3 du même formulaire avec des données différentes - donc je crée 3 JSONObjects, un pour chaque forme entry - 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é l'appel sur un peu:

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 modifications apportées à 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, ce 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 par une chaîne JSON. Il est mal formaté je pense (ce qui est la première fois que je l'ai utilisé JSON):

Si dans le fichier php que je fais un écho sur $ _POST [ « véhicule »] Je reçois le texte suivant:

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

Quelqu'un peut-il me dire où je vais mal, ou s'il y a une meilleure façon d'accomplir ce que j'essaie de faire? Espérons que ce qui précède a du sens!

+0

Merci de prendre le temps de documenter votre problème avec la réponse 403. J'ai eu la même chose pendant une semaine et votre poste m'a enfin fait bouger dans la bonne direction! –

+0

@Toran Billups pas un problème, je suis content qu'il vous a aidé !! – Scoobler

+0

Vos variables postent sur votre script PHP correctement. Comment pourriez-vous tirer chaque variable dites «ingénieur» et «carburant» et les insérer dans une base de données MySQL par exemple. Il semble que tout ce que vous pouvez faire est juste d'utiliser la variable '$ _POST ['vehicle'];' Je serais très heureux de recevoir une réponse à cela. – WebDevDanno

Répondre

11

Après beaucoup de lecture et de recherche que j'ai trouvé le problème, je crois que magic_quotes_gpc est activé sur le serveur.

Ainsi, en utilisant:

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

Dans mon exemple, au-dessus des barres obliques retire et permet JSON à décoder correctement.

Vous ne savez toujours pas pourquoi l'envoi d'un StringEntity provoque une erreur 403?

+0

c'est correct! : D – gumuruh

+1

Pourriez-vous éventuellement partager votre fichier PHP qui contient 'json_decode' parce que je pense que mon serveur décode les données json (à tort) peut être lié à la vôtre. – WebDevDanno

+0

json_decode (stripslashes ($ _ POST ['vehicle']), true); retournera le tableau php, json_decode (stripslashes ($ _ POST ['vehicle']))); retourne php stdclass obj, ce qui est difficile à utiliser. +1 pour la réponse correcte, merci –

0

changement

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

à

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

marque Question à la fin est nécessaire lorsque vous essayez d'envoyer des paramètres script php.

+3

Merci Sergey, mais j'utilise une méthode POST pour envoyer les données, ne pas passer les paramètres pour GET à partir du script PHP. – Scoobler

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

Essayez ce code, il fonctionne 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) { 
} 

}

0

Essayez ce code, il 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" 
 
     } 
 
    }

puis appelez classe HttpClient cette AsyncTask Comme ceci:

classe privée YourTask étend AsyncTask {private String error_msg = "! Erreur de 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 

    } 
}