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

  • 相关阅读:
    sql语句查询结果排序
    Spring MVC 注解
    Spring MVC 编程流程步骤
    菜鸟学自动化测试(一)—-selenium IDE
    list和set的区别
    Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
    是否可以从一个static方法内部发出对非static方法的调用?
    Shiro运行原理?
    shiro有哪些组件?
    简述Shiro的核心组件?
  • 原文地址:https://www.cnblogs.com/waitfate/p/4260416.html
Copyright © 2020-2023  润新知