Android — отправьте запрос с помощью Volley и получите в переполнение стека

Я пытаюсь использовать залп в моем проекте для обработки всех моих HTTP-запросов, так как это самый эффективный, насколько я знаю. Итак, я начал изучать залп, следуя этому AndroidHive учебник.

Мой первый запрос GET был успешным. Затем я перешел к запросу POST и потерпел неудачу. В Stack Overflow я видел, что у многих людей возникали проблемы при объединении запроса на передачу залпа с PHP. Я считаю, что мы не можем получить к нему доступ обычным способом, который $_POST[""] as volley отправляет объект JSON по указанному нами URL.

Было много решений, которые я попробовал, но не смог. Я предполагаю, что должен быть простой и стандартный способ использования залпа с PHP. Поэтому я хотел бы знать, что мне нужно сделать, чтобы получить объект json, отправленный volley в мой PHP-код.

А также, как я могу проверить, действительно ли volley отправляет объект JSON?

Мой код залпа для отправки простого почтового запроса:

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

Мой PHP-код для получения объекта JSON: (Я уверен, что это неправильный путь, я не так хорош в PHP)

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

Я попробовал много способов принятия объекта JSON в PHP, как этот
echo file_get_contents('php://input');

Результат

null

РЕДАКТИРОВАТЬ (правильный путь благодаря грузинским Benetatos)

Я создал класс, как вы упомянули имя класса CustomRequest что следующим образом:

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

}

Теперь в своей деятельности я назвал следующее:

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

Мой PHP-код выглядит следующим образом:

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

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

Теперь возвращаем правильное значение:

Droider

25

Решение

У меня было много проблем, попробуйте это!

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

Вы должны сделать карту, карта поддерживает тип ключ-значение, а затем вы отправляете с залпом.
В php вы получаете $ variable = $ _POST [«key_from_map»], чтобы получить его значение в переменной $
Затем вы создаете ответ и json_encode его.

Вот пример php того, как запросить sql и опубликовать ответ в виде 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);

Здесь вы можете увидеть, что тип ответа — JSONObject

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

Посмотрите на параметр слушателя!

16

Другие решения

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

и на вашей стороне сервера:

<?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 и увидим результат.

7

Вот простой код для отправки пост-запроса в 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'}
}

Источник: Android Volley Post Учебник по запросу

5

всегда используйте StringRequest с залпом, так как это более безопасный способ получить ответ от сервера, если JSON поврежден или неправильно отформатирован.

Код 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);

PHP-код:

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

Это хорошо работает для меня, если это помогает кому-либо

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

Логин.php

<?php
$message = $_POST["email"];
echo $message;
?>
0
По вопросам рекламы [email protected]