Я исследовал всюду и не могу понять это.
Я пишу тестовый запрос 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 post utf8_encode (), чтобы закодировать строку до требуемого utf 8 addslashes (), чтобы добавить косые черты перед кавычками
Ничего не работает.
Любые идеи, почему 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; }
Оказывается, что когда JSON отправляется cURL внутри параметров сообщения & quot; заменяет «как часть кодировки сообщения». Я не уверен, почему функция preg_replace (), которую я пробовал, не работала, но с помощью html_entity_decode () удалили & и сделали JSON-декодирование возможным.
старый:
$return_obj->setData(json_decode($data['data']));
новые:
$data = json_decode( urldecode( $data['data'] ), true ); $return_obj->setData($data);
попробуйте это любопытно, если это сработает.