使用PHP cUrl发送后解码JSON

时间:2010-12-13 22:06:26

标签: php rest json

我到处研究,无法解决这个问题。

我正在编写一个测试cUrl请求来测试我的REST服务:

// initialize curl handler
$ch = curl_init();

$data = array(
"products" => array ("product1"=>"abc","product2"=>"pass"));
$data = json_encode($data);

$postArgs = 'order=new&data=' . $data;

// set curl options
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postArgs);
curl_setopt($ch, CURLOPT_URL, 'http://localhost/store/rest.php');

// execute curl
curl_exec($ch);

这很好用,我的服务接受请求,并根据需要填充$ _Post,包含两个变量,顺序和数据。数据具有编码的JSON对象。当我打印出$ _Post ['data']时,它会显示:

{"products":{"product1":"abc","product2":"pass"}}

这正是预期的内容,与发送内容相同。

当我尝试解码时,json_decode()不返回任何内容!

如果我创建一个新字符串并手动输入该字符串,json_decode()工作正常!

我试过了:

strip_tags()删除可能已在http帖子中添加的任何标记 utf8_encode()将字符串编码为所需的utf 8 addslashes()在引号

之前添加斜杠

没有任何作用。

从http发布消息收到字符串后,为什么json_decode()无效?

以下是我处理参考请求的相关部分:

public static function processRequest($requestArrays) {
    // get our verb
    $request_method = strtolower($requestArrays->server['REQUEST_METHOD']);
    $return_obj = new RestRequest();
    // we'll store our data here
    $data = array();

    switch ($request_method) {
        case 'post':
            $data = $requestArrays->post;
            break;
    }

    // store the method
    $return_obj->setMethod($request_method);

    // set the raw data, so we can access it if needed (there may be
    // other pieces to your requests)
    $return_obj->setRequestVars($data);

    if (isset($data['data'])) {
        // translate the JSON to an Object for use however you want
        //$decoded = json_decode(addslashes(utf8_encode($data['data'])));
        //print_r(addslashes($data['data']));
        //print_r($decoded);
        $return_obj->setData(json_decode($data['data']));
    }
    return $return_obj;
 }

2 个答案:

答案 0 :(得分:2)

事实证明,当cURL在post参数&内发送JSON时QUOT;替换“作为消息编码的一部分。我不知道为什么我尝试的preg_replace()函数不起作用,但使用html_entity_decode()删除了& quot并使JSON可解码。

答案 1 :(得分:0)

旧:

$return_obj->setData(json_decode($data['data']));

新:

$data = json_decode( urldecode( $data['data'] ), true );
$return_obj->setData($data);

如果有效的话,试试它。