Envoyer la demande de poste en utilisant Volley et recevoir en PHP

j'essaie d'utiliser volley dans mon projet pour gérer toutes mes requêtes HTTP car c'est la plus efficace pour autant que je sache. J'ai donc commencé à apprendre le volley en suivant ce tutoriel AndroidHive .

ma première demande a été acceptée. Puis je suis passé à la demande de poste et j'ai échoué. J'ai vu sur le débordement de pile de nombreuses personnes ont eu des problèmes combinant la demande de post de volley avec PHP. Je crois que nous ne pouvons pas accéder à l'aide de la voie normale qui est $_POST[""] comme volley envoie un objet JSON à L'URL que nous spécifions.

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 une façon simple et standard d'utiliser volley avec PHP. Donc je voudrais savoir que dois-je 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?

My volley code pour envoyer simple demande de courrier:

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 code PHP pour recevoir l'objet json: (je suis assez sûr que c'est la mauvaise voie, Je ne suis pas que bon en PHP)

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

j'ai essayé beaucoup de façons d'accepter l'objet JSON en PHP comme celui-ci aussi echo file_get_contents('php://input');

Le Résultat

null

EDIT (La bonne voie grâce à géorgien Benetatos)

j'ai créé la classe comme vous l'avez mentionné le nom de la classe est CustomRequest 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 son retour de la valeur correcte:

Droider
24
demandé sur ik024 2014-09-20 15:17:59

5 réponses

a eu beaucoup de problèmes moi-même, essayez ça !

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 soutient 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 de construire la réponse et json_encode.

voici un exemple de php sur la façon d'interroger sql et de poster la réponse comme 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
répondu Georgian Benetatos 2014-09-20 13:04:55
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 du côté de 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);    
?>

ouvrir MyName.txt et voir le résultat.

6
répondu mmlooloo 2014-09-25 08:03:07

voici un code simple pour envoyer une requête post au script php

activité principale.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.151930920 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: Android Volley POST Request Tutorial

4
répondu Belal Khan 2016-02-16 02:55:57

utilisez toujours StringRequest avec volley car il est plus sûr d'obtenir la réponse du serveur , si JSON est endommagé ou mal formaté.

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

CODE PHP:

<?php
   $name = $_POST["name"];
   $j = array('name' =>$name);
   echo json_encode($j);
?>
3
répondu Raghav Satyadev 2018-09-11 17:06:12

cela fonctionne très 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.151930920 php"

<?php
    $message = $_POST["email"];
    echo $message;
?>
0
répondu sha1962 2018-09-11 07:11:41