牛骨文教育服务平台(让学习变的简单)
博文笔记

thinkphp 接收前端java传参 获取不到数据

创建时间:2017-07-22 投稿人: 浏览次数:554

公司开发一款APP,后台写了个接口,获取前端java传参数据,结果用I(), $_GET(),$_POST()等都获取不到数据…

排错过程:
1.url传参测试可以获取数据;
2.肯定是服务器端的问题,尝试用

file_get_contents("php://input");

于是改用下面的代码获取数据,成功!

public function getItemInfo()
    {

        $tmp = file_get_contents("php://input");
        $arr = json_decode($tmp,true);

        $tid = $arr["itemId"]?$arr["itemId"]:I("itemId");//三目运算符里的I()为了兼容url传参的,前端是新手,有时候混合着用,所以先这么写了
        $uid = $arr["uid"]?$arr["uid"]:I("uid");
        $location = $arr["location"]?$arr["location"]:I("location");

        if(!$uid) $uid = "unreg";//未传用户uid,默认设置 为 uid = "unreg"的用户

        if(!$tid){

            $this->error("扫描出错",0);
        }
        //下面代码省略...
    }

PS:有时候解析成 关联数组 还是取不到数据,特别是前端只传一个参数的时候,那就解析成 对象 来取参数,上述中:

    //$arr = json_decode($tmp,true);改成
    $obj = json_decode($tmp);
    //$tid = $arr["itemId"]?$arr["itemId"]:I("itemId");改成:
    $tid = $obj->itemId?$obj->itemId:I("itemId");
    //$uid = $arr["uid"]?$arr["uid"]:I("uid"); 改成:
    $uid = $obj->uid?$obj->uid:I("uid");

总之,先看看$tmp里面有没有获取到前端传过来的内容,如果有内容,问题肯定是出在后端了,用一切办法根据$tmp里内容的格式,把需要的参数取出来。

后记:经过查看前端接口传参的代码,发现一个问题:
安卓 用 Okhttp2.x 版本传参的时候如果使用RequestBody.create(JSON,jsonObject.toString()); 后端不容易获取到前端传递的数据。
安卓关键代码如下:

    String uid = "asdf24";//uid准备传给后台
    JSONObject jo = new JSONObject();
    jo.put("uid",uid);//对象赋值
    //创建请求内容 对象jo 就是在这里 被转成JSON格式的
    RequestBody body = RequestBody.create(JSON,jo.toString());
    //创建一个请求对象
    Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();

    //以下代码 Okhttp2.x 和 Okhttp3.x基本相同,不用看了        
     Call call = client.newCall(request);
     try {
         Response response = call.execute();
         str = response.body().string();

     } catch (IOException e) {
         e.printStackTrace();
     }        

而用 Okhttp3.x 版本中 后台很容易就获取到前端传参了
安卓关键代码如下:

//创建请求内容,并赋值
RequestBody body = new FormBody.Builder()
                .add("uid", "asdf24")
                .build();
        //创建一个请求对象
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        //以下代码 Okhttp2.x 和 Okhttp3.x基本相同,不用看了        
        Call call = client.newCall(request);
        try {
            Response response = call.execute();
            str = response.body().string();

        } catch (IOException e) {
            e.printStackTrace();
        }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。