Soru Gönderilen PHP curl isteği hakkında bilgi nasıl alınır?


Bir web servisinin 'getToken' bitiş noktasına bir curl isteğini ayıklamaya çalışıyorum.

URL ve auth bilgisinin curl tanıtıcısına doğru şekilde yazıldığından% 100 emin değilim.

Kullanmaya çalışıyorum curl_getinfo($ch, CURLINFO_HEADER_OUT); gönderilen isteği yakalamak için, ama bana çok bilgi vermez. Gerçek curl isteğinin neye benzediğine dair daha fazla derinlemesine teşhis almanın bir yolu var mı?

İşte kod:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");       
curl_setopt($ch, CURLOPT_HEADER, 1); // just getting header to see if we got an auth token
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_setopt($ch, CURLOPT_NOBODY, 1); 
curl_setopt($ch, CURLINFO_HEADER_OUT, 1); // capture the header info
curl_setopt($ch, CURLOPT_VERBOSE, 1); // turn verbose on    
// execute the curl request 

$rh = fopen("request.txt", "w"); // open request file handle
$verbose = fopen('php://temp', 'rw+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);

curl_exec($ch); // execute request

$sent_request = curl_getinfo($ch, CURLINFO_HEADER_OUT);
fwrite($rh, $sent_request); // save the request info
fclose($rh);
!rewind($verbose);
$verboseLog = stream_get_contents($verbose);

echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";

Bu her şey mümkün olduğu kadar çalışır, ancak her seferinde bir 401 döndürür - API yöneticisi bana sahip olduğum kullanıcı adı / geçişin doğruluğunu garanti eder.

Bir şekilde URL değerinin yanlış olduğunu veya doğru kullanıcı adını / geçişi göndermediğimi merak ettim, ancak bu bilgi kaydedilen istek verilerinde yazdırılmıyor:

HEAD /export/auth HTTP/1.1
Authorization: Basic Y2FpcmRzdW5mYTpENWlAaVM4cw==
Host: webservices.mycompany.com
Accept: */*

Kullanıcı adının / geçişin kaydedilmediğini görebilirsiniz (güvenlik için varsayalım). Bence son nokta URL host değer artı HEAD değer, yani webservices.mycompany.com/export/auth?

"Verbose Information" ifadesi hiçbir şey yazdırmaz. Neden bu konuda da emin değilim!

Yardım için teşekkürler.

EDIT: eklenen ayrıntılı mod Php - Debugging Curl yorumcu immulatin'e teşekkürler


32
2018-06-13 16:47


Menşei


Ayrıntılı değeri true olarak ayarlayabilirsiniz: stackoverflow.com/questions/3757071/php-debugging-curl - immulatin
İlk kontrol edeceğim şey, minimum parametrelerle çok daha basit bir istek yapmak ve tüm değişkenler değerlerimi manuel olarak yazdım (url, login, password). Bunun gibi kablolu hatalar genellikle ekstra boşluklar vb. Gibi hatalı biçimlendirilmiş girdilerden kaynaklanır. - Ranty
Bence bu eski yazı yararlı olabilir.stackoverflow.com/questions/866946/...; - nik.longstone


Cevaplar:


Ayarlarsanız CURLINFO_HEADER_OUT için true, giden başlıklar tarafından döndürülen dizide kullanılabilir curl_getinfo()altında request_header anahtar:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.com/bar");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "someusername:secretpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

curl_exec($ch);

$info = curl_getinfo($ch);
print_r($info['request_header']);

Bu yazdırılacak:

GET /bar HTTP/1.1
Authorization: Basic c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk
Host: foo.com
Accept: */*

Yetkilendirme ayrıntılarının base64 kodlu olduğunu unutmayın:

echo base64_decode('c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk');
// prints: someusername:secretpassword

Ayrıca, herhangi bir URL ayrılmış karakterden kaçmak için kullanıcı adı ve şifrenin yüzde kodlanmış olması gerektiğini de unutmayın (/, ?, &, : ve benzeri) içerebilirler:

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));

50
2018-06-10 18:32





Gibi bir proxy aracı kullanabilirsiniz Charles vekil ayrıntılarını ileterek, giden istek başlıklarını, verileri, vb. CURLOPT_PROXY senin için curl_setopt_array yöntem.

Örneğin:

$proxy = '127.0.0.1:8888';
$opt = array (
    CURLOPT_URL => "http://www.example.com",
    CURLOPT_PROXY => $proxy,
    CURLOPT_POST => true,
    CURLOPT_VERBOSE => true,
    );

$ch = curl_init();
curl_setopt_array($ch, $opt);
curl_exec($ch);
curl_close($ch);

3
2017-11-20 23:06





curl_getinfo() curl işleyicisini kapatmadan önce eklenmelidir

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.com/bar");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "someusername:secretpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$info = curl_getinfo($ch);
curl_exec($ch);
print_r($info['request_header']);

1
2017-09-04 03:04



curl_getinfo() sonra kullanmalısın curl_exec()Yani kodunuz yanlıştı! - Nabi K.A.Z.


İstek bir request.txt detaylarla

$ch = curl_init();
$f = fopen('request.txt', 'w');
curl_setopt_array($ch, array(
CURLOPT_URL            => $url, 
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_VERBOSE        => 1,
CURLOPT_STDERR         => $f,
));
$response = curl_exec($ch);
fclose($f);
curl_close($ch);

Curl_getinfo () işlevini de kullanabilirsiniz.


0
2017-09-25 07:34