Fopen ve curl_setopt kullanarak HTTP isteği

CURL yoksa, fopen kullanarak HTTP istekleri göndermek istiyorum. Bir PACKT RESTful PHP kitabından bir sınıf için kod aldım ama işe yaramıyor. Herhangi bir fikir neden?

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 "kullanıcı adı: şifre" dir. Bunu kaldırmayı denedim ama hala hiçbir şey alamıyorum. Ayrıca önerilen ve hala hiçbir şey olarak fpassthru() remoeved var. "Çalışmıyor" ile, $ sonucunu eklediğimde hiçbir şey üretilmiyor demek istiyorum. Boş bir sayfa alıyorum ... yardımın için teşekkürler.
katma yazar LeeTee, kaynak
.... Ve auth içeriğini yazınız.
katma yazar Mob, kaynak
"Neden işe yaramadı" konusunda daha spesifik olabilir misiniz?
katma yazar Linus Kleen, kaynak
Ayrıca, fark ettim, fpassthru() kullanıyorsunuz. $ sonuç 'un gerçek yanıtı içermesini istiyorsanız, sonucu çıktı arabelleğine gönderdiği ve döndürmediği için bu işlevi kullanamazsınız.
katma yazar Linus Kleen, kaynak

2 cevap

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

header seçeneği bir dizedir, bu yüzden @Mob, \ r \ n ve dizi yerine dizgi birleştirmeyi kullanmanız gerektiğini belirtir. Ancak, user_agent geçerli bir anahtardır, bunun yerine bunu yalnızca kullanabilirsiniz.

$ auth değişkeninin içeriğinin Yetkilendirme: blah - yani standart başlık formatı boyunca bir şey olduğunu tahmin ediyorum.

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
katma
Tamam, çalışma örneğini kullanmaya çalıştım ve hala hiç sonuç almadım. HTTP temel yetkisini kullanmam gerekiyor ve yanlış yaptığım şey bu. Ama eğer bu yanlış bir ihtimal varsa, bir hata yapmalı mıyım?
katma yazar LeeTee, kaynak
$ Auth'u "kullanıcı adı: şifre" olarak denedim ve ayrıca "Kimlik Doğrulama: kullanıcı adı: şifre" yi denedim. Bunun nasıl yapılması gerektiğine dair bir belge bulamıyorum.
katma yazar LeeTee, kaynak
evet bu çok çalışıyor, çok teşekkürler
katma yazar LeeTee, kaynak
Teşekkürler, bu "hayatımı kurtardı": D
katma yazar devnull69, kaynak
$ auth var içeriğinizin içeriği nedir?
katma yazar Benjie, kaynak
Base64, kullanıcı adı: şifre 'yi kodlar ve daha sonra başlığa yapıştırır - bkz. Güncellenmiş cevap Yetkilendirme: Temel base64 (kullanıcı adı: şifre)
katma yazar Benjie, kaynak

Bunu karıştırıyorsun. Olmaması gerekenler:

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

İşte PHP el kitabından başlıkları belirleme örneği

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