fopenとcurl_setoptを使用したHTTPリクエスト

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;
}
1
authは "username:password"です。私はこれを削除しようとしましたが、まだ何も得られません。私はfpassthru()も示唆しているように修正しました。 「うまくいきません」とは、$ resultをエコーアウトしたときに何も出力されていないことを意味します。私は空白のページを...あなたのおかげで助けます。
追加された 著者 LeeTee,
....そしてauthの内容を投稿してください。
追加された 著者 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
追加された
OK、Iveは実際の例を使ってみましたが、結果は得られませんでした。私はHTTPの基本認証を使用する必要があり、これは私が間違ってやっていることです。しかし、これが間違ったサーリーなら、私はいくつかのエラーを取得する必要がありますか?
追加された 著者 LeeTee,
Iveは$ authを "username:password"として渡してみました。また、 "Authentication:username:password"を試みました。これをどうやって行うべきかについて私は何の書類も見つけることができません。
追加された 著者 LeeTee,
ええ、これは動作します、ありがとう
追加された 著者 LeeTee,
ありがとう、これは "私の人生を救った":D
追加された 著者 devnull69,
あなたの $ auth varの内容は何ですか?
追加された 著者 Benjie,
Base64は username:password をエンコードしてヘッダーに貼り付けます - 更新された答えを見てください Authorization:Basic base64(username:password)
追加された 著者 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
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com