本文编写于 395 天前,最后修改于 394 天前,其中某些信息可能已经过时。

PHP 请求Json操作与网络调试

如何获得POST的json的值

有的时候我们使用php curl发送请求后,返回的是一串json值,如何获取这段json的数据呢?

要知道,我们用$_POST['any']$_GET['any']平常获取的数值是需要对应的key值的,而纯json并没有一个key值来让我们获取,那么我们应该怎么做才能获取呢?

利用php://input赋值变量即可

$post = json_decode(json_decode(file_get_contents('php://input')));

两次decode是因为获取的字符串经过了转义,出现了很多斜杠,如

[{\"ID\":\"99d2a341-ea2e-4f04-b4f4-623153d64336\",\"Name\":\"王五\",\"TotalScores\":80,\"工作效率\":\"B\",\"职业道德\":\"B\",\"业务能力\":\"A\",\"链接自律\":\"B\",\"工作成绩\":\"B\"},
{\"ID\":\"728f72ac-473b-4bde-bf83-7ed93d3fd9e6\",\"Name\":\"李四\",\"TotalScores\":80,\"工作效率\":\"B\",\"职业道德\":\"B\",\"业务能力\":\"A\",\"链接自律\":\"B\",\"工作成绩\":\"B\"},
{\"ID\":\"29c80443-d0ac-414c-91b5-acd5e69e28f2\",\"Name\":\"刘七\",\"TotalScores\":80,\"工作效率\":\"B\",\"职业道德\":\"B\",\"业务能力\":\"A\",\"链接自律\":\"B\",\"工作成绩\":\"B\"}]

假设我们获取的json为

{
    "status": {
        "code": "200",
        "url": "www.jisuying.com",
        "title": "阿瑟斯"
    }
}

如何获得json内的具体keyvalue

以上面的例子为例

面向对象的php代码中

有的时候无法通过$array['key']来获取json内的具体字典值

需要使用$var1 = $array->key来获取数据,如

//原本用这种无法获取
$code = $post['status']['code']; //200
//现在用箭头可以获取
$code = $post->status->code; //200

这样就能获得具体的值了

如何获得详细的curl信息

由于php是在服务端进行网络请求,相关信息不会显示在前端的chrome网络调试中

所以在调试php网络请求的时候就需要暴露具体的过程

在curl语句里面加上这么一条,返回的内容就会有具体的调试值

//调试curl
if (!curl_errno($curl)) {
    print_r(curl_getinfo($curl));
}

附封装好的php curl的get和post请求函数

postCurl

/**
 * @function 封装curlpost方法
 * @param string $url 发送请求的地址
 * @param string $data 要发送的数据
 * @param string $type 要发送的类型,例如json
 * @author Andy 改自我也不知道哪里来的代码
 * @return $res 返回数据
*/ 
public function postCurl($url,$data,$type='')
{
    if($type == 'json'){
        $data = json_encode($data);//对数组进行json编码
        $header= array("Content-type: application/json;charset=UTF-8","Accept: application/json","Cache-Control: no-cache", "Pragma: no-cache");
    }else{
        $header= array("Content-type: application/x-www-form-urlencoded;charset=UTF-8");
    }
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL,$url);
    curl_setopt($curl,CURLOPT_POST,1);
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
    if(!empty($data)){
        curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
    }
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
    $res = curl_exec($curl);
    if(curl_errno($curl)){
        echo 'Error+'.curl_error($curl);
    }
    //调试curl
    // if (!curl_errno($curl)) {
    //     print_r(curl_getinfo($curl));
    // }
    curl_close($curl);
    return $res;
}

getCurl

/**
 * @function 封装curlget方法
 * @param string $url 发送请求的地址
 * @author Andy 改自我也不知道哪里来的代码
 * @return $data 返回解码的json数据
 */ 
public function curl_get($url) 
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    return json_decode($data);//对数据进行json解码
}