2015-11-18 1 views
6

настоящее время я использую следующий код:Content-Length undefined? Странная ошибка при использовании PlaceSpotter образец кода PHP в Yahoo

<?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


Последняя EDIT

Я обновил свой код, основанный на @ 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», «причина»: «код статуса не 200» из бэкэнд: 415 »}

погрешность.

+0

Можете ли вы уточнить сообщение об ошибке? скопируйте-вставьте здесь сообщение об ошибке, которое вы получите. –

+0

Привет, хороший день, сообщение об ошибке: No Content Length Описание: Не удалось обработать этот запрос, потому что не было указано Content-Length. – DjangoRocks

+0

достаточно информации? – DjangoRocks

ответ

3

Вы не отправляете данные POST, поэтому не отправляется Content-Length. Чтобы сделать правильный запрос на завивание, вам необходимо указать, какие данные вы хотите отправить. В вашем случае это, вероятно, будет:

curl_setopt($ch, CURLOPT_POSTFIELDS, $request->to_postdata()); 

IF он должен быть запрос POST. PlaceSpotter docs гласит:

Веб-служба PlaceSpotter поддерживает только метод HTTP PUT. Другие методы HTTP не поддерживаются.

Так что я предполагаю, что это должно быть PUT метод вместо:

$request = OAuthRequest::from_consumer_and_token($consumer, NULL,"PUT", $url,$args); 
.... 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); 

EDIT для 415 кодом_ответа

Это может быть проблема с двойным urlencode Инг.

Попробуйте установить аргументы, как незакодированной текст:

$args["documentType"] = "text/plain"; 
$args["documentContent"] = $text; 
+0

Привет, хороший день, я попытался использовать PUT в соответствии с вашим примером кода, но я все равно получаю 'No Content Length Description: Не удалось обработать этот запрос, потому что не было указанной длины Content-Length. '. – DjangoRocks

+0

@DjangoRocks, запрос 'PUT' по-прежнему требует отправки некоторых данных. 'CURLOPT_POSTFIELDS' все еще применяются для метода« PUT ». –

+0

Привет, я обновил свой код. Но теперь я получаю '{" bossresponse ": {" responsecode ":« 500 »,« reason »:« код состояния не 200: из-за ошибки: 415 »}'. мой код неправильный? Приветствия. – DjangoRocks

2

Согласно RFC-2616Content-Type заголовка указывает размер тела объекта без заголовков.Поэтому, если вы хотите сделать POST-запросы без сущностей, вы должны указать Content-Length: 0. Попробуй.