2017-01-11 66 views
4

我想使用file_get_contents「發佈」到一個url並獲得auth令牌。我遇到的問題是它返回一個錯誤。發送請求file_get_content not working

Message: file_get_contents(something): failed to open stream: HTTP request failed! HTTP/1.1 411 Length Required.

我不知道是什麼原因造成這一點,但需要幫助。這是功能。

public function ForToken(){ 
     $username = 'gettoken'; 
     $password = 'something'; 
     $url = 'https://something.com'; 
     $context = stream_context_create(array (
      'http' => array (
      'header' => 'Authorization: Basic ' . base64_encode("$username:$password"), 
      'method' => 'POST' 
      ) 
     )); 

     $token = file_get_contents($url, false, $context); 
     if(token){ 
      var_dump($token); 
     }else{ 
      return $resultArray['result'] = 'getting token failed'; 
     } 
    } 

我試過用POSTMAN,它的工作原理,所以唯一的問題是,爲什麼它沒有與file_get_contents一起工作。

+0

一些東西必須與你的'$ context'混淆,並且'Content-Length'標題丟失。 –

+0

@ patryk-uszynski如何添加Content-Length? –

+0

'file_get_content'有一些限制。試用CURL –

回答

0

我不能評論,因爲我的名聲;

在一些服務器file_get_content不可用......

您可捲曲嘗試像this

+0

接受了您的建議,用CURL試用了它,但始終返回false .. –

+0

您能否將CURL代碼發佈到主帖以備將來參考? – ahmetertem

+0

創建了一個粘貼bin,以便您可以檢查 http://pastebin.com/YdWd8hu3 –

0

您的要求還沒有任何數據和內容長度丟失。

你可以試試這個:

public function ForToken(){ 
    $username = 'gettoken'; 
    $password = 'something'; 
    $url = 'https://something.com'; 

    $data = array('foo' => 'some data'); 
    $data = http_build_query($data); 

    $context_options = array (
    'http' => array (
     'method' => 'POST', 
     'header'=> "Content-type: application/x-www-form-urlencoded\r\n" 
      . "Authorization: Basic " . base64_encode("$username:$password") . "\r\n" 
      . "Content-Length: " . strlen($data) . "\r\n", 
     'content' => $data 
     ) 
    ); 

    $context = context_create_stream($context_options); 

    $token = file_get_contents($url, false, $context); 
    if(token){ 
     var_dump($token); 
    }else{ 
     return $resultArray['result'] = 'getting token failed'; 
    } 
} 

這裏有類似的問題:

How to fix 411 Length Required error with file_get_contents and the expedia XML API?

+0

用戶名和密碼在哪裏? –

+0

@Masnad Nihit和以前一樣。您必須將它們連接到標題字符串中,並用'\ r \ n'分開 –

+0

我正在嘗試您的示例但未通過,請您更新您的示例但添加我的信息。 –

0

RFC2616 10.4.12 http://tools.ietf.org/html/rfc2616#section-10.4.12

代碼:(不工作,見下文)

public function ForToken(){ 
$username = 'gettoken'; 
$password = 'something'; 
$url = 'https://something.com'; 
$context = stream_context_create(array (
'http' => array (
'header' => 'Authorization: Basic ' . base64_encode("$username:$password") . 'Content-Length: ' . strlen($url) . '\r\n', 
'method' => 'POST' 
) 
)); 
$token = file_get_contents($url, false, $context); 
if(token){ 
var_dump($token); 
}else{ 
return $resultArray['result'] = 'getting token failed'; 
} 
} 

第二個嘗試:

public function ForToken(){ 
$username = 'gettoken'; 
$password = 'something'; 
$url = 'https://something.com'; 
$context_options = array (
'http' => array (
'method' => 'POST', 
'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Authorization: Basic " . base64_encode("$username:$password") . "Content-Length: " . strlen($url) . "\r\n", 
'content' => $url 
) 
); 
$context = stream_context_create($context_options); 
$token = file_get_contents($url, false, $context); 
if(token){ 
var_dump($token); 
}else{ 
return $resultArray['result'] = 'getting token failed'; 
} 
} 

這是patryk-uszynski的答案與OP的代碼格式化。

+0

這段代碼不工作,不幸的是。 –

+0

真的嗎?;(。我想我有它....我會再試一次。 –

+0

我的雙引號我認爲是問題 –

2

不能命令,所以我會這樣做。如果你使用郵差,你爲什麼不讓郵遞員爲你生成代碼。在郵遞員中,您可以在請求中點擊代碼,甚至可以選擇您想要的代碼語言。像cURL一樣的PHP:

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => "http://somthing.com/", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "POST", 
    CURLOPT_HTTPHEADER => array(
    "password: somthing", 
    "username: gettoken" 
), 
)); 

$response = curl_exec($curl); 
$err = curl_error($curl); 

curl_close($curl); 

if ($err) { 
    echo "cURL Error #:" . $err; 
} else { 
    echo $response; 
} 

希望這會有所幫助!

+0

收到此錯誤 捲曲錯誤#:SSL證書的問題:無法獲得放入這行代碼在curl_setop_array CURLOPT_SSL_VERIFYPEER本地頒發者證書 –

+0

=>假, –

+0

一個新的錯誤,現在 HTTP錯誤411的請求必須進行分塊或者有一個內容長度。 –