【问题标题】:HTTP request using fopen and curl_setopt使用 fopen 和 curl_setopt 的 HTTP 请求
【发布时间】:2011-10-28 11:57:10
【问题描述】:

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

【问题讨论】:

  • 您能否更具体地说明为什么“它不起作用”?
  • .... 并发布 auth 的内容。
  • 另外,我刚刚注意到,您使用的是fpassthru()。如果您希望 $result 包含实际响应,则不能使用该函数,因为它会将结果溢出到输出缓冲区并且不返回它。
  • 身份验证是“用户名:密码”。我已经尝试删除它,但仍然没有得到任何东西。我还按照建议删除了 fpassthru() ,但仍然没有。 “它不起作用”是指当我回显 $result 时没有输出任何内容。我得到一个空白页...感谢您的帮助。

标签: php http curl fopen


【解决方案1】:

此处列出了 HTTP 上下文选项:http://www.php.net/manual/en/context.http.php

header 选项是一个字符串,所以正如@Mob 所说,您应该使用\r\n 和字符串连接而不是数组。但是,user_agent 是有效的密钥,因此您可以直接使用它。

我猜$auth 变量的内容类似于Authorization: blah - 即标准标题格式?

以下代码是一个工作示例。请注意,我已将您的fpassthru()(将内容输出到浏览器,并且不将其存储到$result)更改为fread() 循环。或者,您可以使用 ob_start();$result = ob_get_clean(); 包装 fpassthru() 调用

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

【讨论】:

  • 好的,我已经尝试使用您的工作示例,但仍然没有得到任何结果。我需要使用 HTTP 基本授权并假设这是我做错的。但如果这是错误的 surley 我应该得到一些错误?
  • 你的$auth var 的内容是什么?
  • 我尝试将 $auth 作为“用户名:密码”传递,也尝试过“身份验证:用户名:密码”。我找不到任何关于如何做到这一点的文档。
  • Base64 编码 username:password 然后将其粘贴到标题中 - 请参阅更新的答案 Authorization: Basic base64(username:password)
  • 谢谢,这“救了我的命”:D
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2013-02-08
    相关资源
    最近更新 更多