Enviar solicitud de correo utilizando Volley y recibir en PHP

Estoy tratando de usar volley en mi proyecto para manejar todas mis solicitudes HTTP, ya que es la más eficiente hasta donde yo sé. Así que empecé a aprender volley siguiendo este tutorial de AndroidHive .

Mi primera solicitud GET fue satisfactoria. Luego me trasladé a la solicitud de POST y fracasé. Vi en el desbordamiento de la pila mucha gente tenía problemas que combinaban la petición del poste del voleo con PHP. Creo que no podemos acceder a él usando la forma normal que es $_POST[""] como volley envía un objeto JSON a la URL que especificamos.

Había muchas soluciones que probé pero no tuve éxito. Supongo que debería haber una forma sencilla y estándar de usar volley con PHP. Así que me gustaría saber qué debo hacer para recibir el objeto json enviado por volley en mi código PHP.

Y también ¿cómo puedo comprobar si volley realmente está enviando un objeto JSON?

Mi código de volea para enviar una simple solicitud de correos:

 JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); pDialog.hide(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); pDialog.hide(); } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("name", "Droider"); return params; } }; // Adding request to request queue AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj); 

Mi código PHP para recibir el objeto json: (Estoy bastante seguro de que este es el camino equivocado, no soy tan bueno en PHP)

 <?php $jsonReceiveData = json_encode($_POST); echo $jsonReceivedData; ?> 

He intentado muchas maneras de aceptar objetos JSON en PHP como éste, así como echo file_get_contents('php://input');

El resultado

 null 

EDIT (La manera correcta gracias a Benetatos georgiano)

CustomRequest la clase como usted mencionó el nombre de la clase es CustomRequest que es como sigue:

 import java.io.UnsupportedEncodingException; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; public class CustomRequest extends Request<JSONObject>{ private Listener<JSONObject> listener; private Map<String, String> params; public CustomRequest(String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = reponseListener; this.params = params; } public CustomRequest(int method, String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.listener = reponseListener; this.params = params; } @Override protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return params; }; @Override protected void deliverResponse(JSONObject response) { listener.onResponse(response); } @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } } 

Ahora en mi actividad llamé a lo siguiente:

 String url = some valid url; Map<String, String> params = new HashMap<String, String>(); params.put("name", "Droider"); CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { Log.d("Response: ", response.toString()); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError response) { Log.d("Response: ", response.toString()); } }); AppController.getInstance().addToRequestQueue(jsObjRequest); 

Mi código PHP es el siguiente:

 <?php $name = $_POST["name"]; $j = array('name' =>$name); echo json_encode($j); ?> 

Ahora su devolver el valor correcto:

 Droider 

Tenía un montón de problemas, probar esto!

 public class CustomRequest extends Request<JSONObject> { private Listener<JSONObject> listener; private Map<String, String> params; public CustomRequest(String url,Map<String, String> params, Listener<JSONObject> responseListener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = responseListener; this.params = params; } public CustomRequest(int method, String url,Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.listener = reponseListener; this.params = params; } @Override protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return params; }; @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONObject response) { listener.onResponse(response); } 

PHP

 $username = $_POST["username"]; $password = $_POST["password"]; echo json_encode($response); 

Tienes que hacer un mapa, el mapa soporta el tipo de valor-clave, y que publicar con volley. En php obtienes $ variable = $ _POST ["key_from_map"] para recuperar su valor en la variable $ Entonces construyes la respuesta y json_encode.

Aquí está un ejemplo de php de cómo consultar el sql y la respuesta del poste detrás como JSON

 $response["devices"] = array(); while ($row = mysqli_fetch_array($result)) { $device["id"] = $row["id"]; $device["type"] = $row["type"]; array_push($response["devices"], $device); } $response["success"] = true; echo json_encode($response); 

Puede ver aquí que el tipo de respuesta es JSONObject

 public CustomRequest(int method, String url,Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) 

¡Mira el parámetro del oyente!

 JSONObject params = new JSONObject(); try { params.put("name", "Droider"); } catch (JSONException e) { e.printStackTrace(); } JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, url, params, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); pDialog.hide(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); pDialog.hide(); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); headers.put("Content-Type", "application/json; charset=utf-8"); return headers; } }; // Adding request to request queue AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj); 

Y en su lado del servidor:

 <?php $value = json_decode(file_get_contents('php://input')); $file = 'MyName.txt'; file_put_contents($file, "The received name is {$value->name} ", FILE_APPEND | LOCK_EX); ?> 

MyName.txt y vea el resultado.

Aquí está un código simple para enviar la petición del poste a la escritura del php

MainActivity.java

 public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String REGISTER_URL = "http://simplifiedcoding.16mb.com/UserRegistration/volleyRegister.php"; public static final String KEY_USERNAME = "username"; public static final String KEY_PASSWORD = "password"; public static final String KEY_EMAIL = "email"; private EditText editTextUsername; private EditText editTextEmail; private EditText editTextPassword; private Button buttonRegister; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextUsername = (EditText) findViewById(R.id.editTextUsername); editTextPassword = (EditText) findViewById(R.id.editTextPassword); editTextEmail= (EditText) findViewById(R.id.editTextEmail); buttonRegister = (Button) findViewById(R.id.buttonRegister); buttonRegister.setOnClickListener(this); } private void registerUser(){ final String username = editTextUsername.getText().toString().trim(); final String password = editTextPassword.getText().toString().trim(); final String email = editTextEmail.getText().toString().trim(); StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show(); } }){ @Override protected Map<String,String> getParams(){ Map<String,String> params = new HashMap<String, String>(); params.put(KEY_USERNAME,username); params.put(KEY_PASSWORD,password); params.put(KEY_EMAIL, email); return params; } }; RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(stringRequest); } @Override public void onClick(View v) { if(v == buttonRegister){ registerUser(); } } } 

VolleyRegister.php

 <?php if($_SERVER['REQUEST_METHOD']=='POST'){ $username = $_POST['username']; $email = $_POST['email']; $password = $_POST['password']; require_once('dbConnect.php'); $sql = "INSERT INTO volley (username,password,email) VALUES ('$username','$email','$password')"; if(mysqli_query($con,$sql)){ echo "Successfully Registered"; }else{ echo "Could not register"; } }else{ echo 'error'} } 

Fuente: Android Volley Post Request Tutorial

Siempre utilice StringRequest con volley ya que es una forma más segura de obtener la respuesta del servidor, si JSON está dañado o no está correctamente formateado.

ANDROID CÓDIGO:

 StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() { @Override public void onResponse(String response) { try {JSONObject jsonObject = new JSONObject(response); } catch (JSONException ignored) { } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { if (volleyError instanceof TimeoutError) { } } }) { @Override public Map<String, String> getParams() throws AuthFailureError { HashMap<String, String> headers = new HashMap<>(); headers.put("name", "Droider"); return headers; } @Override public Priority getPriority() { return Priority.IMMEDIATE; } }; ApplicationController.getInstance().addToRequestQueue(stringRequest); 

CÓDIGO PHP:

 <?php $name = $_POST["name"]; $j = array('name' =>$name); echo json_encode($j); ?> 

Esto funciona bien para mí si esto ayuda a alguien

 public class LoginActivity extends AppCompatActivity { private EditText Email; private EditText Password; private String URL = "http://REPLACE ME WITH YOUR URL/login.php"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); TextView register = (TextView) findViewById(R.id.Register); TextView forgotten = (TextView) findViewById(R.id.Forgotten); Button login = (Button) findViewById(R.id.Login); Email = (EditText) findViewById(R.id.Email); Password = (EditText) findViewById(R.id.Password); Password.setImeOptions(EditorInfo.IME_ACTION_DONE); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RequestQueue MyRequestQueue = Volley.newRequestQueue (LoginActivity.this); MyRequestQueue.add(MyStringRequest); } }); } StringRequest MyStringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() { @Override public void onResponse(String response) { Toast.makeText(getApplicationContext(),response.trim(), Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { //Create an error listener to handle errors appropriately. @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getApplicationContext(),error.toString().trim(), Toast.LENGTH_LONG).show(); } }) { protected Map<String, String> getParams() { final String email = Email.getText().toString().trim(); final String password = Password.getText().toString().trim(); Map<String, String> MyData = new HashMap<String, String>(); MyData.put("email", email); MyData.put("password", password); return MyData; } }; } the login.php <?php $message = $_POST["email"]; echo $message; ?> 
  • Uploader de archivos Android con php de servidor
  • Obtención de datos de Mysql DB a listView utilizando JSON y PHP
  • Seguridad y autenticación cliente-servidor
  • Cifrado AES Java -> PHP -> Java
  • Cordova android: Cargando datos de la base de datos con desplazamiento infinito en onsenui
  • Utilizando GCM para enviar notificaciones en la aplicación, devuelve InvalidRegistration error
  • Recibiendo la respuesta del eco del HTTP POST de un archivo de PHP (enviar los POSTS funciona muy bien, es el recibir que no puedo imaginar)
  • Secure Asset / Media Folder a través del Auth Controller? Laravel 5.2
  • Generar android apk utilizando shell script de php?
  • Tratando de obtener array de php y almacenar en java, android
  • Android GCM un dispositivo tiene múltiples registro
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.