我想在我的項目中使用volley來處理我所有的HTTP請求,因爲據我所知它是最高效的。所以我開始按照這個AndroidHive tutorial學習凌空。使用Volley發送帖子請求並在PHP中接收
我的第一個GET請求成功了。然後我轉到POST請求,但失敗了。我在Stack Overflow上看到很多人遇到了將抽象請求與PHP結合的問題。我相信我們無法使用$_POST[""]
這種常規方式訪問它,因爲volley會將JSON對象發送到我們指定的URL。
我嘗試了很多解決方案,但都沒有成功。我想應該有一個簡單和標準的方式使用PHP的抽象。所以我想知道爲了接收我的PHP代碼中由volley發送的json對象,我需要做些什麼。
而且我該如何檢查volley是否確實發送了JSON對象?
我凌空代碼來發送簡單的POST請求:
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
您沒有收到在PHP數據,使用$ username = $ _POST [「username」]; 其中$ _POST [「username」];是你的post參數的關鍵,這將返回值。 – 2014-09-20 12:48:53
排除有PHP $ _POST ['']的問題,您可以使用此解決方案http://stackoverflow.com/a/32644310/3741698 – 2015-09-18 05:12:39
<?php $ post = json_decode(file_get_contents(「php:// input」)) ,真);在抽動的情況下很好地工作。你不需要CustomRequest。 – miralong 2017-12-16 17:14:07