volley jsonobjectrequest example php android json http android-volley

jsonobjectrequest - Enviar solicitud de publicación con Volley y recibir en PHP



example android (5)

Estoy tratando de usar volley en mi proyecto para manejar todas mis solicitudes HTTP, ya que es la más eficiente que yo sepa. Entonces comencé a aprender voley siguiendo este tutorial de AndroidHive .

Mi primera solicitud GET fue exitosa. Luego pasé a la solicitud POST y fallé. Vi en Stack Overflow que muchas personas tenían problemas para combinar la solicitud posterior de volley con PHP. Creo que no podemos acceder a él usando la forma normal que es $_POST[""] ya que 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 simple y estándar de usar volley con PHP. Por lo tanto, 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 verifico si volley realmente está enviando un objeto JSON?

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

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 esta es la forma incorrecta, no soy tan bueno en PHP)

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

Intenté muchas formas de aceptar objetos JSON en PHP como este también echo file_get_contents(''php://input'');

El resultado

null

EDITAR (La forma correcta gracias a Benetatos georgianos)

CustomRequest la clase como mencionaste, el nombre de la clase es CustomRequest que es el siguiente:

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é 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 está devolviendo el valor correcto:

Droider


Aquí hay un código simple para enviar una solicitud de publicación al script 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: Tutorial de solicitud de publicación de Android Volley


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

el login.php

<?php $message = $_POST["email"]; echo $message; ?>


Tuve muchos problemas, prueba 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);

Tiene que hacer un mapa, el mapa admite el tipo de clave-valor, y luego lo publica con volley. En php obtienes $ variable = $ _POST ["key_from_map"] para recuperar su valor en la variable $ Luego construyes la respuesta y json_encode.

Aquí hay un ejemplo de PHP sobre cómo consultar SQL y publicar la respuesta 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!


siempre use 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á formateado correctamente.

CÓDIGO DE ANDROID:

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> params = new HashMap<>(); params.put("name", "Droider"); return params; } @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); ?>


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 el 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); ?>

abra MyName.txt y vea el resultado.