内容长度未定义?使用Yahoo的PlaceSpotter示例php代码

时间:2015-11-18 14:14:57

标签: php yahoo-api

我目前正在使用以下代码:

<?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”:“非200状态代码   来自后端:415“}

错误。

2 个答案:

答案 0 :(得分:3)

您不发送POST数据,因此不会发送Content-Length。要制作正确的卷曲请求,您需要指定要发送的数据。在你的情况下,它很可能是:

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

IF 它应该是POST请求。 PlaceSpotter docs读取:

  

PlaceSpotter Web服务仅支持HTTP PUT方法。不支持其他HTTP方法。

所以我认为它应该是PUT方法:

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

编辑415响应代码

urlencode可能是个问题。

尝试将参数设置为未编码的文本:

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

答案 1 :(得分:2)

根据RFC-2616 Content-Type标题表示没有标题的实体主体的大小。因此,如果您想在没有entity-body的情况下发出POST请求,则应指定Content-Length: 0。试一试。