Search code examples
phpyahoo-api

Yahoo Gemini - Making PUT request


I'm using https://github.com/saurabhsahni/php-yahoo-oauth2/blob/master/YahooOAuth2.class.php

Using this example I'm able to create and get Objects (create campaign, retrieve campaign) but not able to do Operations like Update and delete.

I'm getting missing fields error as it's taking it as POST call. For Update / delete I need to make PUT request.

So for that I've added in the following case in YahooOAuth2.class.php file

if($method) 
{
curl_setopt($curl, CURLOPT_PUT, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
}

Here is the complete function

 public function fetch($url, $postdata = "", $auth = "", $headers = "", $method="")
    {
        $curl = curl_init($url);

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //Temporarily added to disable authenticity of the peer's certificate 

        if ($postdata) {
             if($method) 
             {  
             curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
             curl_setopt($curl, CURLOPT_PUT, true);      
             curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
             }
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
        } else {
            curl_setopt($curl, CURLOPT_POST, false);
        }
        if ($auth) {
            curl_setopt($curl, CURLOPT_USERPWD, $auth);
        }
        if ($headers) {
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($curl);
        if (empty($response)) {
            // some kind of an error happened
            die(curl_error($curl));
            curl_close($curl); // close cURL handler
        } else {
            $info = curl_getinfo($curl);
            curl_close($curl); // close cURL handler
            if ($info['http_code'] != 200 && $info['http_code'] != 201) {
                echo "Received error: " . $info['http_code']. "\n";
                echo "Raw response:".$response."\n";
                die();
            }
        }
        return $response;
    }

When I run the file I'm getting the following response

object(stdClass)#2 (3) { ["errors"]=> array(1) { [0]=> object(stdClass)#3 (4) { ["errIndex"]=> int(-1) ["code"]=> string(28) "E10000_INTERNAL_SERVER_ERROR" ["message"]=> string(12) "invalid JSON" ["description"]=> string(0) "" } } ["response"]=> NULL ["timestamp"]=> string(18) "2015-07-20 6:21:14" }

It's working fine for create and retrieve but not for update and delete.

Here is the example file to make Update Campaign.

<?php

require "YahooOAuth2.class.php"; 

#Your Yahoo API consumer key & secret with access to Gemini data 

define("CONSUMER_KEY","sdfsadfw23r23423rsdf--");
define("CONSUMER_SECRET","234234sdfwr");
$redirect_uri="http://".$_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$gemini_api_endpoint="https://api.admanager.yahoo.com/v1/rest";
//$gemini_api_endpoint="https://sandbox-api.admanager.yahoo.com/v1/rest";

$oauth2client=new YahooOAuth2();

if (isset($_GET['code'])){
    $code=$_GET['code'];    
} 
else {
    $code=0;
}

if($code){
     $token=$oauth2client->get_access_token(CONSUMER_KEY,CONSUMER_SECRET,$redirect_uri,$code);
     $headers= array('Authorization: Bearer '.$token,'Accept: application/json','Content-Type: application/json');
     $url=$gemini_api_endpoint."/campaign/";
    $data = array("id"=>12356,"budget"=> 500);  
     $postdata = json_encode($data);
     $method = "PUT";
     $resp=$oauth2client->fetch($method, $url,$postdata,$auth="",$headers);
      $jsonResponse = json_decode( $resp);
      var_dump($jsonResponse);
}
else {
    # no valid access token available, go to authorization server 
    header("HTTP/1.1 302 Found");
    header("Location: " . $oauth2client->getAuthorizationURL(CONSUMER_KEY,$redirect_uri));
    exit;
}

?>

Any help would be much appreciated.

Is there any method to do Update/delete operations or did I miss anything from above? I found no example from Yahoo Gemini Documentation for Updating Objects


Solution

  • Finally I've ended up like this. In the YahooOAuth2.class.php file . I've just added the following code under fetch function.

    if ($postdata) 
    {
    curl_setopt($curl, CURLOPT_POST, true);
    if($method)  curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); // For Update and Delete requests
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
    }
    

    It's working like a charm. I hope it helps someone