Расшифровка JSON после отправки с использованием PHP cUrl - PullRequest
3 голосов
/ 14 декабря 2010

Я исследовал всюду и не могу понять это.

Я пишу тестовый запрос 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 addlashes () для добавления косой черты перед кавычками

Ничего не работает.

Есть идеи, почему json_decode () не работает после получения строки из сообщения http?

Ниже приведена соответствующая часть моей обработки запроса на справку:

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 ]

2 голосов
/ 15 декабря 2010

Оказывается, что когда JSON отправляется cURL в параметрах записи & quot; заменяет "как часть кодировки сообщений. Я не уверен, почему пробованная мной функция preg_replace () не сработала, но использование html_entity_decode () удалило & quot и сделало JSON-декодирующим.

0 голосов
/ 14 декабря 2010

старый:

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

новый

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

попробуй, мне интересно, работает ли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...