今天用PHP开发Android网络数据接口的时候,发现Thinkphp的I函数(php的$_POST)并不能获取到androidpost过来的数据
Android代码如下:
1 Map<String,String> map = new HashMap<>(); 2 map.put("itemid",this.itemid); 3 JsonObjectRequest jor = new JsonObjectRequest(Request.Method.POST,url,new JSONObject(map),new Response.Listener<JSONObject>() { 4 @Override 5 public void onResponse(JSONObject jsonObject) { 6 try{ 7 if("OK".equals(jsonObject.getString("status"))){ 8 JSONObject returnDdata = jsonObject.getJSONObject("data"); 9 data.clear(); 10 if("out".equals(returnDdata.getString("inout"))){ 11 data.add("类型:支出"); 12 }else{ 13 data.add("类型:收入"); 14 } 15 data.add("主题:"+returnDdata.getString("info")); 16 data.add("金额:"+returnDdata.getString("money")); 17 data.add("时间:"+XLFunc.xl_timestamp_to_datetime(returnDdata.getLong("time")*1000,"yyyy-MM-d")); 18 data.add("结算:"+returnDdata.getString("result")); 19 adapter.notifyDataSetChanged(); 20 listVview.setLayoutAnimation(lac); 21 }else{ 22 XLFunc.xl_toast(DetailActivity.this,jsonObject.getString("data"),0); 23 } 24 }catch (JSONException e){ 25 XLFunc.xl_toast(DetailActivity.this,"网络异常!",0); 26 } 27 } 28 },new Response.ErrorListener() { 29 @Override 30 public void onErrorResponse(VolleyError volleyError) { 31 XLFunc.xl_toast(DetailActivity.this,"获取详细信息时出现错误!请检查网络是否正常!",0); 32 } 33 }){ 34 @Override 35 public Map<String, String> getHeaders() throws AuthFailureError { 36 Map<String,String> headers = new HashMap<>(); 37 headers.put("Content-Type","application/json; charset=utf-8"); 38 return headers; 39 } 40 }; 41 jor.setShouldCache(false); 42 this.requestQqueue.add(jor);
headers设置发送了,也没有使用getParams(网上说使用这个方法服务端得不到POST数据,只能重载JSONObjectRequest,另话,在这不提!)
可是PHP端
var_dump($_POST);
为空!
上网查询后,发现使用如下的方式能够获取到POST数据:
1 $postDdata = file_get_contents('php://input'); 2 $postDdata = json_decode($postDdata, true); 3 4 $return = array(); 5 $itemid = intval($postDdata['itemid']);
也就是说使用php://input输入流的方式获取是能获取的,那么也就是说android端已经正常提交数据了,那么问题出现在PHP端了!
由Android提交数据的headers:
headers.put("Content-Type","application/json; charset=utf-8")
可知,Android端发送的是json,
查看PHP关于$_POST的说明:
$HTTP_POST_VARS contains the same initial information, but is not a superglobal. (Note that $HTTP_POST_VARS and $_POST are different variables and that PHP handles them as such)
然后查看$_POST和php://input的区别:
$HTTP_RAW_POST_DATA contains the raw POST data. In general, php://input should be used instead of $HTTP_RAW_POST_DATA.
可知:php://input通常代替$HTTP_RAW_POST_DATA 而$HTTP_RAW_POST_DATA包含原始提交的数据
而POST是过滤掉不能解析的数据,比如json数据!这些过滤掉的数据就放到了$HTTP_RAW_POST_DATA中,所以我们需要使用php://input来获取post过来的json对 数据!