2011-10-28 75 views
1

如果cURL不可用,我想使用fopen發送HTTP請求。我從PACKT RESTful PHP書中獲得了一個類的代碼,但它沒有工作。任何想法爲什麼?使用fopen和curl_setopt的HTTP請求

if ($this->with_curl) {  
    //blah 
} else {  
    $opts = array (
      'http' => array (
      'method' => "GET", 
      'header' => array($auth, 
      "User-Agent: " . RESTClient :: USER_AGENT . "\r\n"), 
      ) 
    ); 
    $context = stream_context_create($opts); 
    $fp = fopen($url, 'r', false, $context); 
    $result = fpassthru($fp); 
    fclose($fp); 
    } 

    return $result; 
} 
+1

你可以是任何更具體的,爲什麼「它不工作」? –

+0

....併發布auth的內容。 – Mob

+0

另外,我剛剛注意到,您正在使用'fpassthru()'。如果您希望'$ result'包含實際響應,則不能使用該函數,因爲它會將結果泄漏到輸出緩衝區中,並且不會返回它。 –

回答

4

設置標題的例子:http://www.php.net/manual/en/context.http.php

header選項是字符串,所以@Mob說你應該使用\r\n和字符串連接而不是數組。但是,user_agent是一個有效的密鑰,因此您可以使用它。

我猜$auth變量的內容是沿着Authorization: blah的行 - 即標準頭格式?

下面的代碼是一個工作示例。請注意,我已將fpassthru()(將內容輸出到瀏覽器,並且不會將其存儲到$result)更改爲fread()循環。或者你可能會包裹fpassthru()呼叫與ob_start();$result = ob_get_clean();

<?php 
class RESTClient { 
    const USER_AGENT = 'bob'; 
} 
$url = 'http://www.example.com/'; 
$username = "fish"; 
$password = "paste"; 
$b64 = base64_encode("$username:$password"); 
$auth = "Authorization: Basic $b64"; 
$opts = array (
     'http' => array (
      'method' => "GET", 
      'header' => $auth, 
      'user_agent' => RESTClient :: USER_AGENT, 
     ) 
); 
$context = stream_context_create($opts); 
$fp = fopen($url, 'r', false, $context); 
$result = ""; 
while ($str = fread($fp,1024)) { 
    $result .= $str; 
} 
fclose($fp); 
echo $result; 
+0

好吧,我試着用你的工作示例,仍然沒有得到任何結果。我需要使用HTTP基本授權,並假設這是我做錯了什麼。但是,如果這是錯誤的,我會得到一些錯誤? – LeeTee

+0

你的'$ auth' var的內容是什麼? – Benjie

+0

我試圖通過$ auth作爲「用戶名:密碼」,並嘗試「身份驗證:用戶名:密碼」。我找不到有關如何完成這些任務的任何文檔。 – LeeTee

1

你在混合這個。它不應該是::

$opts = array (
      'http' => array (
      'method' => "GET", 
      'header' => $auth . "\r\n" . //removed array() 
         "User-Agent: " . RESTClient :: USER_AGENT . "\r\n") 
      ) 

這裏的HTTP上下文選項都在這裏奠定了從PHP手冊

$opts = array(
    'http'=>array(
    'method'=>"GET", 
    'header'=>"Accept-language: en\r\n" . 
       "Cookie: foo=bar\r\n" 
) 
);