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
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!
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.
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'}
}
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);
?>
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;
?>