HTTP-запрос с использованием fopen и curl_setopt - PullRequest
2 голосов
/ 28 октября 2011

Если cURL недоступен, я хочу отправлять HTTP-запросы, используя fopen.Я получил код для класса из книги PACKT RESTful PHP, но он не работает.Есть идеи почему?

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;
}

Ответы [ 2 ]

7 голосов
/ 28 октября 2011

Параметры HTTP-контекста изложены здесь: 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;
1 голос
/ 28 октября 2011

Вы смешиваете это. Разве это не должно быть ::

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

Вот пример установки заголовков из руководства по PHP

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