2015-11-18 5 views
6

Ich bin derzeit mit dem folgenden Code:Inhaltslänge undefiniert? Weird-Fehler mit Yahoos PlaceSpotter Probe PHP-Code

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

Mit meinem eigenen Zugangsschlüssel und alle mit der OAuth.php Bibliothek.

Irgendwie habe ich immer einen Content-Length undefined Fehler bekommen.

Wenn ich Content-Length so zu definieren, um zu versuchen waren (basierend auf einige Antworten hier auf Stackoverflow gesehen.

curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Length:'.strlen($text))); 

Ich bekomme keine Antwort

Darf ich wissen, wie kann diese Problem gelöst wird

Dank

PS:? das pHP-Beispiel stammt aus dem offiziellen Beispiel: https://gist.github.com/ydn/bcf8b301125c8ffa986f#file-placespotter-php


AKTUELLE EDIT

ich meinen Code aktualisiert haben, basierend auf @ alexblex Kommentar

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

Derzeit dieser neue Code gibt einen

{ "bossresponse": {"responsecode": "500", "Grund": "nicht 200 Statuscode von Backend: 415"}

Fehler.

+0

Können Sie genauer auf die Fehlermeldung sein? Bitte kopieren Sie hier die Fehlermeldung, die Sie erhalten. –

+0

Hallo guten Tag, die Fehlermeldung lautet: Nein Inhalt Länge Beschreibung: Diese Anfrage konnte nicht verarbeitet werden, da keine Content-Length angegeben wurde. – DjangoRocks

+0

ist die Information genug? – DjangoRocks

Antwort

3

Sie senden keine POST-Daten, daher wird keine Inhaltslänge gesendet. Um eine korrekte Curl-Anforderung zu erstellen, müssen Sie angeben, welche Daten Sie senden möchten. In Ihrem Fall ist es wahrscheinlich:

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

IF es eine POST-Anforderung sein sollte. Die PlaceSpotter docs lautet:

Der PlaceSpotter-Webdienst unterstützt nur die HTTP-PUT-Methode. Andere HTTP-Methoden werden nicht unterstützt.

Also gehe ich davon aus das Verfahren stattdessen PUT werden soll:

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

EDIT für 415 Antwortcode

Es kann mit Doppel urlencode ing ein Thema sein.

Versuchen Argumente als unverschlüsselte Text zu setzen:

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

Hallo guten Tag, ich habe versucht, PUT nach Ihrem Codebeispiel zu verwenden, aber ich bekomme immer noch die 'No Content Length Beschreibung: konnte diese Anfrage nicht verarbeiten, da keine Content-Length angegeben wurde. Fehler. – DjangoRocks

+0

@DjangoRocks, "PUT" -Anforderung benötigt noch einige Daten zum Senden. 'CURLOPT_POSTFIELDS' gelten immer noch für' PUT'-Methode. –

+0

Hallo, ich habe meinen Code aktualisiert. Aber ich erhalte jetzt '{" bossresponse ": {" responsecode ":" 500 "," reason ":" nicht 200 Statuscode vom Backend: 415 "}' error. ist mein Code falsch? Prost. – DjangoRocks

2

Per RFC-2616Content-Type Header gibt die Größe des Entity-Body ohne Header.Wenn Sie also POST-Anfragen ohne Entity-Body stellen möchten, geben Sie Content-Length: 0 an. Probieren Sie es aus.