Я пытаюсь использовать volley в своем проекте для обработки всего моего HTTP-запроса, поскольку он является наиболее эффективным, насколько мне известно. Поэтому я начал изучать воллей, следуя этому учебному руководству AndroidHive.
Мой первый запрос GET был успешным. Затем я перешел к запросу POST, и я потерпел неудачу. Я видел, что в Qaru у многих людей возникли проблемы с объединением почтового запроса волейбола с PHP. Я считаю, что мы не можем получить к нему доступ, используя обычный способ $_POST[""]
, поскольку волейбол отправляет объект JSON на указанный вами URL.
Было много решений, которые я пробовал, но не удалось. Я предполагаю, что должен быть простой и стандартный способ использования волейбола с PHP. Поэтому я хотел бы знать, что мне нужно сделать, чтобы получить объект json, посланный volley в моем PHP-коде.
А также как проверить, действительно ли залп посылает объект 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
EDIT (Правильный путь благодаря грузинскому 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