Yahoo Gemini - 发出 PUT 请求
Yahoo Gemini - Making PUT request
我正在使用 https://github.com/saurabhsahni/php-yahoo-oauth2/blob/master/YahooOAuth2.class.php
使用 this example 我能够创建和获取对象(创建活动、检索活动)但无法执行 Update 和 删除.
我收到缺少字段错误,因为它将它作为 POST 调用。对于更新/删除,我需要发出 PUT 请求。
为此,我在 YahooOAuth2.class.php 文件
中添加了以下情况
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'));
}
这里是完整的函数
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;
}
当我 运行 文件时,我得到以下响应
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" }
create 和 retrieve 工作正常,但 update 和 删除.
这是制作更新活动的示例文件。
<?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;
}
?>
如有任何帮助,我们将不胜感激。
是否有任何方法可以进行 Update/delete 操作,或者我是否遗漏了上面的任何内容?我在 Yahoo Gemini Documentation 中找不到更新对象
的示例
颠倒语句的顺序,因为最后一个 CURLOPT_POSTFIELDS
暗示了 CURLOPT_POST
,正如此处 http://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html 的文档中所指出的那样。所以你需要用 PUT
覆盖它,如下所示:
if($method)
{
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl, CURLOPT_PUT, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
}
最后我变成了这个样子。在 YahooOAuth2.class.php 文件中。我刚刚在 fetch 函数下添加了以下代码。
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);
}
它的效果非常好。我希望它能帮助某人
我正在使用 https://github.com/saurabhsahni/php-yahoo-oauth2/blob/master/YahooOAuth2.class.php
使用 this example 我能够创建和获取对象(创建活动、检索活动)但无法执行 Update 和 删除.
我收到缺少字段错误,因为它将它作为 POST 调用。对于更新/删除,我需要发出 PUT 请求。
为此,我在 YahooOAuth2.class.php 文件
中添加了以下情况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'));
}
这里是完整的函数
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;
}
当我 运行 文件时,我得到以下响应
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" }
create 和 retrieve 工作正常,但 update 和 删除.
这是制作更新活动的示例文件。
<?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;
}
?>
如有任何帮助,我们将不胜感激。
是否有任何方法可以进行 Update/delete 操作,或者我是否遗漏了上面的任何内容?我在 Yahoo Gemini Documentation 中找不到更新对象
的示例颠倒语句的顺序,因为最后一个 CURLOPT_POSTFIELDS
暗示了 CURLOPT_POST
,正如此处 http://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html 的文档中所指出的那样。所以你需要用 PUT
覆盖它,如下所示:
if($method)
{
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl, CURLOPT_PUT, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
}
最后我变成了这个样子。在 YahooOAuth2.class.php 文件中。我刚刚在 fetch 函数下添加了以下代码。
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);
}
它的效果非常好。我希望它能帮助某人