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  = 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对 数据!

posted @ 2015-01-29 17:13  waitfate  阅读(806)  评论(0编辑  收藏  举报