PHP api调用CURL和身份验证

时间:2017-06-02 14:27:48

标签: php authentication curl

我收到了这段代码:

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代码..?

2 个答案:

答案 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));
            }
    }