В настоящее время я использую следующий код:
<?php
/* Pre-requisite: Download the required PHP OAuth class from http://oauth.googlecode.com/svn/code/php/OAuth.php. This is used below */
require("OAuth.php");
$url = "https://yboss.yahooapis.com/geo/placespotter";
$cc_key = "MY_KEY";
$cc_secret = "MY_SECRET";
$text = "EYES ON LONDON Electric night in 100-meter dash";
$args = array();
$args["documentType"] = urlencode("text/plain");
$args["documentContent"] = urlencode($text);
$consumer = new OAuthConsumer($cc_key, $cc_secret);
$request = OAuthRequest::from_consumer_and_token($consumer, NULL,"POST", $url,$args);
$request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, NULL);
$url = sprintf("%s?%s", $url, OAuthUtil::build_http_query($args));
$ch = curl_init();
$headers = array($request->to_header());//.',Content-Length: '.strlen($text));
//print_r($headers.',Content-Length: '.strlen($text));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// somehow this line is not solving the issue
// curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Length:'.strlen($text)));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$rsp = curl_exec($ch);
print_r($rsp);
//echo "======= ENDING";
?>
С моими собственными ключами доступа и всем, с библиотекой OAuth.php.
Каким-то образом я продолжал получать неопределенную ошибку Content-Length.
Если бы я попытался определить Content-Length следующим образом (основываясь на некоторых ответах, увиденных здесь на StackOverFlow:
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Length:'.strlen($text)));
Я не получаю никакого ответа.
Могу ли я узнать, как можно решить эту проблему?
Спасибо!
PS: пример php взят из официального примера: https://gist.github.com/ydn/bcf8b301125c8ffa986f#file-placespotter-php
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ
Я обновил свой код на основе комментария @ alexblex
<?php
/* Pre-requisite: Download the required PHP OAuth class from http://oauth.googlecode.com/svn/code/php/OAuth.php. This is used below */
require("OAuth.php");
$url = "https://yboss.yahooapis.com/geo/placespotter";
$cc_key = "MY_KEY";
$cc_secret = "MY_SECRET";
$text = "EYES ON LONDON Electric from Singapore Raffles Place";
$args = array();
$args["documentType"] = urlencode("text/plain");
$args["documentContent"] = urlencode($text);
$args["outputType"] = "json";
$consumer = new OAuthConsumer($cc_key, $cc_secret);
$request = OAuthRequest::from_consumer_and_token($consumer, NULL,"PUT", $url, $args);
$request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, NULL);
$url = sprintf("%s?%s", $url, OAuthUtil::build_http_query($args));
$ch = curl_init();
$headers = array($request->to_header());//.',Content-Length: '.strlen($text));
//$headers = array($request->to_header().',Content-Length="'.strlen($text).'"');
//$headers = array($request->to_header().',Content-Length: 277');
print_r($headers);
//print_r($headers.',Content-Length: '.strlen($text));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request->to_postdata());
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$rsp = curl_exec($ch);
echo "\n\n\n\n";
var_dump($rsp);
//print_r($rsp);
?>
В настоящее время этот новый код возвращает
{«bossresponse»: {«responsecode»: «500», «reason»: «non 200 code code
от бэкэнда: 415 «}
ошибка.
Вы не отправляете данные POST, следовательно, Content-Length не отправляется. Чтобы сделать правильный запрос скручивания, вам нужно указать, какие данные вы хотите отправить. В вашем случае это может быть:
curl_setopt($ch, CURLOPT_POSTFIELDS, $request->to_postdata());
ЕСЛИ это должен быть запрос POST. PlaceSpotter документы гласит:
Веб-служба PlaceSpotter поддерживает только метод HTTP PUT. Другие методы HTTP не поддерживаются.
Поэтому я предполагаю, что это должен быть метод PUT:
$request = OAuthRequest::from_consumer_and_token($consumer, NULL,"PUT", $url,$args);
....
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
РЕДАКТИРОВАТЬ для кода ответа 415
Это может быть проблема с двойным urlencode
ING.
Попробуйте установить аргументы как незакодированный текст:
$args["documentType"] = "text/plain";
$args["documentContent"] = $text;
Согласно RFC-2616 Content-Type
заголовок указывает размер тела объекта без заголовков. Поэтому, если вы хотите делать POST-запросы без тела объекта, вам следует указать Content-Length: 0
, Дайте это попробовать.