公司开发一款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();
}