web-dev-qa-db-fra.com

Envoyer une demande en utilisant Volley et recevoir en PHP

J'essaie d'utiliser volley dans mon projet pour traiter toutes mes requêtes HTTP car c'est la plus efficace à ma connaissance. J'ai donc commencé à apprendre la volée en suivant ceci Tutoriel AndroidHive .

Ma première demande GET a abouti. Ensuite, je suis passé à la demande POST et j'ai échoué. J'ai vu sur Stack Overflow que beaucoup de gens avaient du mal à combiner la demande de volleyball avec PHP. Je crois que nous ne pouvons pas y accéder de la manière habituelle, c'est-à-dire $_POST[""], puisque volley envoie un objet JSON à l'URL spécifiée.

Il y avait beaucoup de solutions que j'ai essayées mais qui n'ont pas réussi. Je suppose qu'il devrait y avoir un moyen simple et standard d'utiliser volley avec PHP. J'aimerais donc savoir ce que je dois faire pour recevoir l'objet json envoyé par volley dans mon code PHP. 

Et aussi comment vérifier si volley envoie vraiment un objet JSON?

Mon code de volley pour envoyer une simple demande de poste:

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

Mon PHP code pour recevoir un objet json: (je suis presque sûr que ce n'est pas le bon chemin, je ne suis pas très bon en PHP)

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

J'ai essayé beaucoup de façons d'accepter un objet JSON dans PHP comme celui-ci également echo file_get_contents('php://input'); 

Le résultat 

null

EDIT (La bonne façon grâce à Georgian Benetatos)

J'ai créé la classe comme vous l'avez mentionné. Le nom de la classe est CustomRequest, ce qui est comme suit:

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

}

Maintenant, dans mon activité, j'ai appelé ce qui suit:

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

Mon code PHP est le suivant:

<?php
$name = $_POST["name"];

$j = array('name' =>$name);
echo json_encode($j);
?>

Maintenant, il retourne la valeur correcte:

Droider
25
ik024

J'ai eu beaucoup de problèmes moi-même, essayez ceci! 

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

Vous devez faire une carte, la carte supporte le type clé-valeur, et que vous postez avec volley . En php, vous obtenez $ variable = $ _POST ["key_from_map"] pour récupérer sa valeur dans la variable $ Ensuite, vous construisez la réponse et json_encode.

Voici un exemple php montrant comment interroger SQL et publier une réponse en 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);

Vous pouvez voir ici que le type de réponse est JSONObject

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

Regardez le paramètre de l'auditeur!

16
Georgian Benetatos
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);

et sur votre serveur:

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

ouvrez MyName.txt et voyez le résultat.

7
mmlooloo

Voici un code simple pour envoyer une demande de publication à un 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'}
}

Source: Didacticiel de demande de poste Android Volley

5
Belal Khan

utilisez toujours StringRequest avec volley car c'est un moyen plus sûr d'obtenir la réponse du serveur si JSON est endommagé ou formaté de manière incorrecte.

Android CODE:

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

PHP CODE:

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

Cela fonctionne bien pour moi si cela aide quelqu'un

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

le login.php

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