para - enviar datos de android a php
Android JSON HttpClient para enviar datos al servidor PHP con HttpResponse (5)
Cambio
(String url = "http://www.server.com/MainPage.php";)
a
(String url = "http://www.server.com/MainPage.php?";)
El signo de interrogación al final es necesario cuando intenta enviar parámetros al script php.
Actualmente estoy intentando enviar algunos datos desde y la aplicación de Android a un servidor php (ambos son controlados por mí).
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, primero creo un objeto JSON (lo he cortado 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");
A continuación, paso el objeto para enviarlo y recibo 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 recibe una respuesta, pero el servidor está devolviendo una respuesta 403 - Prohibida.
He intentado cambiar un poco la función doPost (esto es en realidad un poco mejor, ya que dije que tengo mucho que enviar, básicamente 3 del mismo formulario con datos diferentes, así que creo 3 JSONObjects, uno para cada entrada de formulario: las entradas provienen de la base de datos en lugar del ejemplo estático que estoy usando).
Primero cambié un poco la llamada:
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, entonces los cambios a 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 a una cadena JSON. Creo que está mal formateado (esta es la primera vez que uso JSON):
Si en el archivo php hago un eco en $ _POST [''vehículo''] obtengo lo siguiente:
{/"date/":/"today/",/"engineer/":/"me/"}
¿Alguien me puede decir dónde me equivoco o si hay una mejor manera de lograr lo que estoy tratando de hacer? Esperemos que lo anterior tenga sentido!
Después de mucha lectura y búsqueda encontré el problema, creo que se habilitó magic_quotes_gpc en el servidor.
Así, utilizando:
json_decode(stripslashes($_POST[''vehicle'']));
En mi ejemplo anterior, se eliminan las barras inclinadas y permite que el JSON se decodifique correctamente.
¿Aún no estás seguro de por qué enviar una StringEntity causa un error 403?
Prueba este código me funciona
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) {
}
}
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"
}
}
entonces llame a la clase HttpClient este AsyncTask como este:
clase privada YourTask extiende AsyncTask {private String error_msg = "Server error!";
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
}
}
StringEntity s = new StringEntity(c.toString());
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
request.setEntity(s);