60

Web サービスの「getToken」エンドポイントへの curl リクエストをデバッグしようとしています。

URL と認証情報が curl ハンドルに正しく書き込まれていると 100% 確信できるわけではありません。

送信されたリクエストをキャプチャするために使用しようとしてcurl_getinfo($ch, CURLINFO_HEADER_OUT);いますが、あまり情報が得られません。実際の curl リクエストがどのように見えるかについて、より詳細な診断を取得する方法はありますか?

コードは次のとおりです。

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

これはすべて機能しますが、毎回 401 を返します。API 管理者は、私が持っているユーザー名/パスが正しいことを保証します。

どういうわけか URL 値が間違っているのか、正しいユーザー名/パスを送信していないのか疑問に思っていましたが、この情報は保存されたリクエスト データに出力されません。

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

ユーザー名/パスが記録されていないことがわかります (セキュリティのためだと思います)。エンドポイント URL は、値に値hostの開始点を加えたものだと思います。HEADwebservices.mycompany.com/export/auth

「Verbose Information」ステートメントは何も出力しません。これも理由がわからない!

手伝ってくれてありがとう。

編集: Phpから詳細モードを追加-コメンター immulatin のおかげでCurl をデバッグ

4

4 に答える 4

91

に設定CURLINFO_HEADER_OUTすると、キーの下で、trueによって返される配列で送信ヘッダーを使用できます。curl_getinfo()request_header

$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']);

これは印刷されます:

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

認証の詳細は base64 でエンコードされていることに注意してください。

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

また、ユーザー名とパスワードは、次の URL 予約文字 ( /?&など:) をエスケープするためにパーセント エンコードする必要があることに注意してください。

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));
于 2014-06-10T18:32:19.733 に答える
3

curl_getinfo()curl ハンドラを閉じる前に追加する必要があります

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.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']);
curl_close($ch);
于 2015-09-04T03:04:02.937 に答える
3

また、 Charlesなどのプロキシ ツールを使用して、プロキシの詳細をメソッドに渡すことで、発信リクエスト ヘッダーやデータなどをキャプチャすることもできCURLOPT_PROXYますcurl_setopt_array

例えば:

$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);
于 2015-11-20T23:06:14.123 に答える