CURLと認証を使用したPHPAPI呼び出し
このコードを取得しました:
// service
$url = 'https://services.daisycon.com/publishers/' . $publisher_id . '/news';
// initialize curl resource
$ch = curl_init();
// set the http request authentication headers
$headers = array( 'Authorization: Basic ' . base64_encode( $username . ':' . $password ) );
// set curl options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// execute curl
$response = curl_exec($ch);
// check http code
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// close curl resource
curl_close($ch);
if ($code == 200)
{
// json decode reponse
$news = json_decode($response);
// display response
foreach ($news as $news_item)
{
echo 'id: ' . $news_item->id . "\n";
echo 'name: ' . $news_item->title . "\n\n";
}
}
そして、このドキュメントを使用して、この認証を調べました。 しかし、コードをエコーすると0が表示されるため、機能させることができません。 私はすべての詳細を記入しました。誰かが私が間違っていることを教えてもらえますか?
編集: これをコンソールで実行すると:
curl https://services.daisycon.com/publishers/{id}/news -u {username}:{password}
その後、正常に動作します。 では、そのコマンドをPHPコードに設定するにはどうすればよいですか。
答え :
解決策:
おそらくcurl_error()を使用して、curl操作でエラーが発生したかどうかを確認します。また、エラーが発生した場合は、どのHTTPコードが返されるかを確認する必要があります。は200OKではありません。確実に200OKを受け取った場合は、応答変数を var_dump()して、目的のデータを受け取っていることと、正しいプロパティ名を使用していることを確認してください。>
以下の内容は、問題が発生していることを確認するのに役立ちます
// service
$url = 'https://services.daisycon.com/publishers/' . $publisher_id .
'/news';
// initialize curl resource
$ch = curl_init();
// set curl options
curl_setopt_array($curl, array(
CURLOPT_URL=> $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"accept: application/json",
"authorization: Basic ".base64_encode($username.":".$password),
"cache-control: no-cache",
"content-type: application/json",
),
));
// execute curl
$response = curl_exec($ch);
$err = curl_error($curl);
// check http code
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// close curl resource
curl_close($ch);
if ($err) {
echo "cURL Error #:" . $err;
}
else{
if ($code == 200)
{
// json decode reponse
$news = json_decode($response);
// display response
foreach ($news as $news_item)
{
//checks if both properties are set
if(isset($news_item->id,$news_item->title)){
echo 'id: ' . $news_item->id . "\n";
echo 'name: ' . $news_item->title . "\n\n";
}
//if not set...
else{
echo "Id Or Title Not Set\n";
var_dump($news);
echo "\n\n";
}
}
}
//if not a 200 OK
else{
echo "Did Not Receive 200 OK\n";
echo "Received Code:".$code."\n\n";
}
}
答え :
解決策:
http基本認証からダイジェスト(ユーザー名/パスワードを転送するより安全な方法)、またはcurlでサポートされている他の認証方法に切り替えた可能性があります。しかし、 curl https://services.daisycon.com/publishers/{id}/news -u {username}:{password}
が機能するという事実は、それがcurlによってネイティブにサポートされている認証メソッドであることを意味します。なぜ自分で認証ヘッダーを作成するのですか?これは難しく、エラーが発生しやすいので、curl(cliプログラム)にログインするように指示するのと同じように、libcurlにログインするように指示する必要があります。
$ch = curl_init();
if(!curl_setopt_array($ch,array(
CURLOPT_HTTPAUTH=>CURLAUTH_ANY,
CURLOPT_USERPWD=>'username:password'
))){throw new \RuntimeException('curl_setopt_array failed. errno:'.curl_errno($ch).'. error:'.curl_error($ch);}
そして、curlコードをデバッグするときは、CURLOPT_STDERRとCURLOPT_VERBOSEを次のように設定します
$debugh=tmpfile();
$debugf=stream_get_meta_data($debugh)['uri'];
curl_setopt_array($ch,array(CURLOPT_STDERR=>$debugh,CURLOPT_VERBOSE=>1));
...
//after curl_exec:
$curldebugstr=file_get_contents($debugf);
var_dump($curldebugstr);
そしてcliプログラムのcurlで、 -v
引数を使用します。次に、php-libcurlが行う要求と、curlコマンドライン引数が行う要求を比較できます。それらの違いは何ですか?多くの場合、彼らは邪悪なユーザーエージェントの検出を行っている可能性があります。その場合、CURLOPT_USERAGENTを使用してcurlcliのユーザーエージェントを偽造できます。また、curl_setopt(_array)が失敗すると、bool(false)が返されます。これがfalseを返すかどうかをチェックするラッパー関数を作成する必要があります。失敗した場合は、実行時例外をスローします。 curl_error()およびcurl_errno()レポートを作成し、それらのラッパーを使用します。 -または、少なくとも、raw関数を使用するたびにリターンを確認してください。
のようなもの
function _curl_setopt_array($ch,array $arr){foreach($arr as $option=>$val){_curl_setopt($ch,$option,$val);}}
function _curl_setopt($ch,int $option,$value){
$ret = curl_setopt ( $ch, $option, $value );
if (! $ret) {
throw new InvalidArgumentException ( 'curl_setopt failed. errno: ' . curl_errno ($ch) . '. error: ' . curl_error ($ch));
}
}
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。