2017-01-17 6 views
0

Ich möchte Json Daten mit CURL in PHP senden, aber das Problem ist, dass CURL keine Daten posten.PHP cUrl nicht posten

HINWEIS: cURL ist ordnungsgemäß installiert und konfiguriert.

$ch = curl_init($url); 
//The JSON data. 
$jsonData = '{ 
    "recipient":{ 
    "id":"'.$sender.'" 
}, 
"message":{ 
    "text":"'.$message_to_reply.'" 
} 
}'; 


$jsonDataEncoded = $jsonData; 

//Tell cURL that we want to send a POST request. 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
//Attach our encoded JSON string to the POST fields. 
curl_setopt($ch, CURLOPT_POSTFIELDS, array($jsonDataEncoded)); 

//Set the content type to application/json 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
curl_exec($ch); 

Die JSON-Daten arbeiten gut, aber der Curl-Pfosten ist nicht alles veröffentlichen und auch keine Art von Warnungen/Bekanntmachung oder Fehlern geben.

+0

Woher weißt du, dass es nichts posten? Außerdem ist JSON nur selten URL-codiert, sind Sie sicher, dass Sie das wollen? Schließlich wird diese Verwendung von CURLOPT_CUSTOMREQUEST nicht empfohlen, entfernen Sie sie einfach. Beachten Sie folgende Weiterleitungen (häufig nach POSTs). –

+0

@DanielStenberg, weil ich ngrok benutze und es gibt keine Statistiken bezüglich des Postings. Auch ich entfernte den urlencode(), aber es funktioniert immer noch nicht. –

+0

Nicht auf der Empfängerseite angemeldet ist nicht unbedingt die gleiche Sache wie "nicht etwas zu tun" obwohl ... –

Antwort

0

Versuchen Sie dies;

curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array(json_decode($jsonDataEncoded))); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

Wahrscheinlich möchten Sie nicht alle Daten an einen Schlüssel übergeben.


Ausgabe von print_r(array($jsonDataEncoded))

Array ([0] => { "recipient":{ "id":"me" }, "message":{ "text":"hello" } }) 


Ausgabe von print_r(json_decode(array($jsonDataEncoded)))

Array ([0] => stdClass Object ([recipient] => stdClass Object ([id] => me) [message] => stdClass Object ([text] => hello))) 
+0

, die kein JSON postet, das die Daten mit multipart/form-data encodieren wird (wenn Sie curl_setopt ein Array geben, wird es automatisch in multipart/form-data umgewandelt) – hanshenrik

+0

Wenn er den JSON als String übergeben möchte, Der Code sollte funktionieren. –

1

soweit ich sehen kann, was Sie tun 3 Fehler

1: nicht tun curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");, die richtige Möglichkeit zu sagen, Curl, dass Sie eine POST-Anfrage ist curl_setopt($ch, CURLOPT_POST, true);

2: Wenn Sie CURLOPT_POSTFIELDS ein Array geben, seine tatsächlich zu einer multipart/form-data Codierung umgewandelt, das ist nicht das, was Sie wollen (Sie json übertragen möchten)

3: Ihr $ sender und message_to_reply $ scheinen einfach zu sein in den JSON eingefügt. Was passiert, wenn Ihr $ message_to_reply einen " oder ' enthält? es wird den JSON ungültig machen. halte es für richtig codiert, zum Beispiel json_encode verwenden, wie

$jsonData = array (
     'recipient' => array (
       'id' => $sender 
     ), 
     'message' => array (
       'text' => $messaage_to_reply 
     ) 
); 
$jsonDataEncoded = json_encode ($jsonData, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); 

aber, vorausgesetzt, dass $ sender und message_to_reply $ ist bereits richtig json kodierte, der einzige Grund, Ihr Original-Code nicht so weit wie ich kann nicht funktioniert, siehe , ist, dass Sie CURLOPT_POSTFIELDS ein Array geben, damit alles, was es „Array“ von dieser Linie, wie curl_setopt($ch, CURLOPT_POSTFIELDS,$jsonDataEncoded);

0

Nun nach all dem Versuch wäre zu beheben gebraucht zu entfernen, ist die Antwort:

$jsonData = '{ 
"recipient":{ 
    "id":"'.$sender.'" 
}, 
"message":{ 
    "text":"'.$message_to_reply.'" 
} 
}'; 

$jsonDataEncoded = $jsonData; 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded); 
//Here i removed the array// 

//Set the content type to application/json 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
// By default in PHP7 CURL_SSL_VERIFYPEER, is true. You have to make it false// 

$result = curl_exec($ch);