首页 > 代码库 > PHP处理Android的POST数据

PHP处理Android的POST数据

今天用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  = http://www.mamicode.com/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             @Override30             public void one rrorResponse(VolleyError volleyError) {31                 XLFunc.xl_toast(DetailActivity.this,"获取详细信息时出现错误!请检查网络是否正常!",0);32             }33         }){34             @Override35             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对 数据!

PHP处理Android的POST数据