2010-12-13 4 views
3

J'ai fait des recherches partout et ne peux pas comprendre cela.Décodage JSON après l'envoi en utilisant PHP cUrl

Je vous écris une demande de cURL de test pour tester mon service 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); 

Cela fonctionne bien et la demande est acceptée par mon service et $ _POST est rempli selon les besoins, avec deux variables, l'ordre et les données . Les données ont l'objet JSON codé. Et quand j'imprimer $ _POST [ « data »] il montre.

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

Ce qui est exactement ce qui est attendu et identique à ce qui a été envoyé dans

Lorsque je tente de décoder, json_decode() ne retourne rien!

Si je crée une nouvelle chaîne et tapez manuellement cette chaîne, json_decode() fonctionne bien!

J'ai essayé:

strip_tags() pour supprimer toutes les balises qui auraient pu être ajoutés dans le poste http utf8_encode() pour encoder la chaîne aux utf requis 8 addslashes() pour ajouter des barres obliques avant les guillemets

Rien ne fonctionne.

Des idées pour lesquelles json_decode() ne fonctionne pas après la réception d'une chaîne à partir d'un message http?

Voici la partie pertinente de mon traitement de la demande de référence:

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; 
} 
+0

ne pas être le problème (d'où un commentaire au lieu d'une réponse), mais vous devez 'urlencode()' la chaîne JSON avant d'envoyer avec cURL http://php.net/urlencode – Jonah

+0

J'ai encodé la chaîne JSON avant de l'envoyer dans cURL, mais le résultat est toujours le même.Cela me rend fou! Merci pour la suggestion cependant – mm2887

+0

après 'if (isset ($ data ['data'])) {', pouvez-vous ajouter un 'var_dump ($ data ['data']) 'et afficher ce qu'il montre? – scoates

Répondre

2

Il s'avère que lorsque JSON est envoyé par cURL à l'intérieur des paramètres de poste & quot; remplace le "dans le cadre de l'encodage de message.Je ne sais pas pourquoi la fonction preg_replace() que j'ai essayé n'a pas fonctionné, mais en utilisant html_entity_decode() a enlevé le & quot et a fait le JSON décodé-capable

0

ancienne:

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

nouvelle:

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

l'essayer im curieux de savoir si cela fonctionne .

+0

N'a rien fait :( – mm2887