2010-03-29 27 views
23

Actualmente estoy tratando de enviar algunos datos y una aplicación de Android a un servidor php (ambos son controlados por mí).Android JSON HttpClient para enviar datos al servidor PHP con HttpResponse

Hay una gran cantidad de datos recopilados en un formulario en la aplicación, esto se escribe en la base de datos. Todo esto funciona

En mi código principal, en primer lugar creo un JSONObject (He cortarlo aquí para este ejemplo):

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

siguiente que pase el objeto sobre para enviar y recibir la respuesta:

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 clase 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; 
} 

Esto consigue una respuesta, pero el servidor devuelve un 40 3 - Respuesta prohibida.

He intentado cambiar un poco la función doPost (esto es en realidad un poco mejor, como he dicho, tengo mucho que enviar, básicamente 3 de la misma forma con datos diferentes, así que creo 3 JSONObjects, uno para cada formulario entrada - las entradas provienen de la base de datos en lugar del ejemplo estático que estoy usando).

En primer lugar me cambiaron la llamada a través de un poco:

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 por lo que los cambios en la función 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 Así que esto devuelve una respuesta 200

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

Sin embargo, los datos recibidos en el servidor no se pueden analizar en una cadena JSON. Se formato no creo que (esta es la primera vez que he utilizado JSON):

Si en el archivo PHP que hago un eco de $ _POST [ 'vehículo'] me sale el siguiente:

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

¿Alguien puede decirme dónde estoy yendo mal, o si hay una mejor manera de lograr lo que estoy tratando de hacer? ¡Espero que lo anterior tenga sentido!

+0

Gracias por tomarse el tiempo para documentar su problema con la respuesta 403. ¡Tuve la misma suerte durante una semana y tu publicación finalmente me hizo avanzar en la dirección correcta! –

+0

@Toran Billups no es un problema, ¡me alegra que te haya ayudado! – Scoobler

+0

Sus variables se publican correctamente en su script PHP. ¿Cómo extraerías cada variable, digamos "ingeniero" y "combustible" e insertarlas en una base de datos MySQL, por ejemplo? Parece que todo lo que puedes hacer es usar la variable '$ _POST ['vehicle'];'. Sería muy bienvenido una respuesta a esto. – WebDevDanno

Respuesta

11

Después de muchas lecturas y búsquedas con las que he encontrado el problema, creo que magic_quotes_gpc está habilitado en el servidor.

Por lo tanto, usando:

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

En mi ejemplo anterior elimina las barras y permite que el JSON para ser decodificado correctamente.

¿Todavía no estoy seguro de por qué enviar un StringEntity provoca un error 403?

+0

¡eso es correcto! : D – gumuruh

+1

¿Podría posiblemente compartir su archivo PHP que contiene 'json_decode' porque creo que la forma en que mi servidor está decodificando los datos json (erróneamente) puede estar relacionado con el suyo. – WebDevDanno

+0

json_decode (stripslashes ($ _ POST ['vehicle']), verdadero); devolverá php array, json_decode (stripslashes ($ _ POST ['vehicle'])); devuelve php stdclass obj, que es difícil de usar. +1 para la respuesta correcta, thx –

0

Cambio

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

a

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

signo de interrogación al final es necesario cuando se está tratando de enviar parámetros al script php.

+3

Gracias Sergey, pero estoy usando un método POST para enviar los datos, no pasando parámetros para GET desde el script PHP. – Scoobler

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

Prueba este código funciona para mí

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

Prueba este código funciona perfectamente

*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" 
 
     } 
 
    }

luego llamar a HttpClient clase este AsyncTask De esta manera:

clase privada YourTask extiende AsyncTask { error_msg private String = "Error de servidor";

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 

    } 
} 
Cuestiones relacionadas