Using Zend_Http_Client to send json POST

12,895

Solution 1

Try change :

$client->setParameterPost('product', $json);

to :

$client->setHeaders('Content-type','application/json');
$client->setParameterPost('product', $json);

or use:

$client->setRawData($json, 'application/json');

Solution 2

So Update / Answer changing how I did it to these lines of code:

    $uri = "http://requestb.in/p6p4syp6";
    $product =  $observer->getEvent()->getProduct();
    $json = Mage::helper('core')->jsonEncode($product);
    Mage::log(" Json={$json}", null,'product-updates.txt');

    $client = new Zend_Http_Client($uri);
    $client->setRawData($json, null)->request('POST');

Changing the SetRawData($json, null) was the bit - using SetRawDate($json, 'application/json') caused it to fail.

Thanks Voodoo417 - I'll also try your suggestion and see if that lets me set the correct type

Share:
12,895
Peter Fletcher
Author by

Peter Fletcher

Updated on June 22, 2022

Comments

  • Peter Fletcher
    Peter Fletcher almost 2 years

    I'm trying to send a json object as a POST command using the following:

        $uri = "http://amore-luce.com/product_create";
        $product =  $observer->getEvent()->getProduct();
        $json = Mage::helper('core')->jsonEncode($product);
        Mage::log(" Json={$json}", null,'product-updates.txt');
    
        // new HTTP request to some HTTP address
        $client = new Zend_Http_Client('http://amore-luce.com/product_create');
        // set some parameters
        $client->setParameterPost('product', $json);
        // POST request
        $response = $client->request(Zend_Http_Client::POST);
    

    When I view the $json the data is there and all looks good - however the POST is not sending the json data. I'm capturing it using a simple email form that should send me the response:

        <?php        
        $webhookContent = "";
        $ref = "";       
        $webhook = fopen('php://input' , 'rb');
        while (!feof($webhook)) {
            $webhookContent .= fread($webhook, 4096);
        }
        fclose($webhook);
    
         $headers = array();
            foreach($_SERVER as $key => $value) {
                if (substr($key, 0, 5) <> 'HTTP_') {
                    continue;
                }
                $header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
                $headers[$header] = $value;
            }
    
        foreach ($headers as $header => $value) {
            $ref .= "$header: $value <br />\n";
        }
    
        $post = file_get_contents('php://input');
        $to = "[email protected]"; //the address the email is being sent to
        $subject = "This is the subject"; //the subject of the message
        $msg = "This is the message  -  Webhook content:  ".$webhookContent."    This is url:  ".$ref; //the message of the email
    
        mail($to, $subject, $msg, 'From: PHP Scriptv2 <[email protected]>'); //send the email.
    
        echo ($_SERVER['HTTP_REFERER']."<br>".$_SERVER['REQUEST_URI']);
        ?>
    

    This page works with other json POST requests I've sent to it. I'm fairly new at sending POST requests so any help would be greatly appreciated.

  • Peter Fletcher
    Peter Fletcher over 9 years
    Using $client->setRawData($json, 'application/json'); fails. However using the two lines above works a treat. Thank you!