使用fopen和curl_setopt的HTTP请求

时间:2011-10-28 11:57:11

标签: php http curl fopen

如果cURL不可用,我想使用fopen发送HTTP请求。我从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 个答案:

答案 0 :(得分:7)

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 :(得分:1)

你正在混合这个。不应该是::

$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"
  )
);