我收到了这段代码:
isImageJpeg
使用此documentation并查看此authentication。 但是当我回显它显示0的代码时,我无法使它工作。 我已经填写了所有细节。有人能告诉我我做错了吗?
修改 当我在控制台中运行时:
// 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";
}
}
然后工作正常。 那么如何将该命令设置为PHP代码..?
答案 0 :(得分:0)
也许使用curl_error()检查curl操作是否有错误,如果不是200 OK,你应该检查看看返回的是什么HTTP代码,如果你肯定收到了200 OK然后可能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";
}
}
答案 1 :(得分:0)
也许他们从http basic auth切换到digest(一种更安全的传输用户名/密码的方法),或curl支持的任何其他auth方法。但是curl https://services.daisycon.com/publishers/{id}/news -u {username}:{password}
有效的事实意味着 IS 是curl原生支持的auth方法。为什么你自己制作auth标头?这很困难且容易出错,您应该告诉libcurl为您登录,就像告诉curl(cli程序)为您登录一样。
$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程序时,使用-v
参数。然后你可以比较php-libcurl发出的请求和curl命令行参数的请求,它们的区别是什么?它可能是因为他们做了邪恶的用户代理检测,在这种情况下,你可以用CURLOPT_USERAGENT伪造卷曲cli的useragent。另外,如果curl_setopt(_array)失败,它将返回bool(false),你应该创建一个包装器函数来检查它是否返回false,如果是,则抛出一个运行时异常,什么参数设置失败,什么curl_error()和curl_errno()报告,并使用这些包装器。 - 或者至少每次使用原始功能时检查返回。
类似
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));
}
}