HTTP-запит за допомогою fopen і curl_setopt

Якщо 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;
}
1
auth - "ім'я користувача: пароль". Я спробував видалити це, але все одно нічого не отримую. Я також відновив fpassthru (), як це було запропоновано, і все одно нічого. Під словом "це не працює", я маю на увазі, що нічого не виводиться, коли я повторюю результат $. Я отримую порожню сторінку ... дякую вам за допомогу.
додано Автор LeeTee, джерело
.... І розмістити вміст авторитету.
додано Автор Mob, джерело
Чи могли б ви бути більш конкретними щодо того, чому "це не працює"?
додано Автор Linus Kleen, джерело
Крім того, я просто помітив, що ви використовуєте fpassthru() . Якщо ви хочете, щоб $ result містила фактичну відповідь, ви не можете використовувати цю функцію, оскільки вона виливає результат у вихідний буфер і не повертає його.
додано Автор Linus Kleen, джерело

2 Відповіді

The HTTP context options are laid out here: http://www.php.net/manual/en/context.http.php

Параметр header є рядком, так як @Mob каже, що ви повинні використовувати \ r \ n і конкатенацію рядків, а не масив. Однак, user_agent є дійсним ключем, тому ви можете просто скористатися цим.

Я гадаю, що зміст $ auth є чимось збігається з рядками Authorization: blah - тобто стандартний формат заголовка?

The below code is a working example. Note that I've changed your fpassthru() (which outputs the content to the browser, and does not store it to $result) to a fread() loop. Alternatively you could have wrapped the fpassthru() call with ob_start(); and $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;
5
додано
добре, я спробував використати ваш робочий приклад і все одно не отримую жодних результатів. Мені потрібно використовувати базову авторизацію HTTP і вважаю це тим, що я роблю неправильно. Але якщо це неправильно surley я повинен отримати деяку помилку?
додано Автор LeeTee, джерело
Я спробував передати $ auth як "ім'я користувача: пароль", а також спробував "Authentication: username: password". Я не можу знайти документацію про те, як це зробити.
додано Автор LeeTee, джерело
так це працює, спасибі так багато
додано Автор LeeTee, джерело
Спасибі, це "врятувало моє життя": D
додано Автор devnull69, джерело
Який вміст вашого $ auth var?
додано Автор Benjie, джерело
База64 кодує ім'я користувача: пароль , а потім прикріплюється до заголовку - див. Оновлений відповідь Авторизація: основна база 64 (ім'я користувача: пароль)
додано Автор Benjie, джерело

Ви змішуєте це. Чи не повинно бути ::

$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"
  )
);
1
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php