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!
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! –
@Toran Billups no es un problema, ¡me alegra que te haya ayudado! – Scoobler
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