Codeigniter 应用程序中的 API 集成

Posted

技术标签:

【中文标题】Codeigniter 应用程序中的 API 集成【英文标题】:API integration in Codeigniter application 【发布时间】:2017-07-31 15:45:42 【问题描述】:

我正在尝试将来自MyOperator 的API 集成到我在CodeIgniter 开发的CRM 项目中。为此,他们为我提供了一些代码,但是当我尝试在我的应用程序中使用该代码时,它给了我 JSON 带有

的数据

404 页面未找到错误

这是他们提供的代码:

<?php                                                                                   

/**
 * @description : Library to access MyOperator Public API
 */
Class Myoperator 

    protected $developers_url = 'https://developers.myoperator.co/';
    protected $token = 'XXXXXXXXX';

    function __construct() 

    

    public function run() 
        # request for Logs
        $url = $this->developers_url . 'search';
        $fields = array("token" => $this->token);
        $result = $this->_post_api($fields, $url);

        $this->log("result");
        $this->log($result);
    

    private function _post_api(Array $fields, $url) 
        try 
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
            $result = curl_exec($ch);
         catch (Exception $e) 
            return false;
        
        $this->log("url");
        $this->log($url);
        $this->log("fields");
        $this->log($fields);
        curl_close($ch);
        if ($result)
            return $result;
        else
            return false;
    

    private function log($message) 
        print_r($message);
        echo "\n";
    




$Class = new Myoperator();
$Class->run();

如果我直接运行这段代码,这段代码会给我想要的输出,但我很困惑在哪里使用这段代码,哪一部分在控制器中,哪一部分在CodeIgniter 中查看。欢迎任何形式的帮助,在此先感谢。

【问题讨论】:

CORS,我认为您需要查看 CORS 设置。如果他们不允许 CORS,则不能从跨 URL(外部 URL)调用 api。 @kishor10d 他们允许 CORS 尝试从这里集成codeigniter restful api库github.com/chriskacerguis/codeigniter-restserver 这是我在执行你的脚本时收到的回复:"status":"error","message":"not authorized request","code":404 @Nguyen Thanh 它使用 POST 请求。 【参考方案1】:

我不是 CodeIgniter 的专家,但在查看文档和一些链接(如 this 和 this)后,您可以像这样创建自己的库:

<?php                                                                                   

defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * @description : Library to access MyOperator Public API
 */
Class Myoperator 

    protected $developers_url = 'https://developers.myoperator.co/';
    protected $token = 'XXXXXXXXX';

    function __construct() 

    

    public function run() 
        # request for Logs
        $url = $this->developers_url . 'search';
        $fields = array("token" => $this->token);
        $result = $this->_post_api($fields, $url);

        $this->log("result");
        $this->log($result);
    

    private function _post_api(Array $fields, $url) 
        try 
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
            $result = curl_exec($ch);
         catch (Exception $e) 
            return false;
        
        $this->log("url");
        $this->log($url);
        $this->log("fields");
        $this->log($fields);
        curl_close($ch);
        if ($result)
            return $result;
        else
            return false;
    

    private function log($message) 
        print_r($message);
        echo "\n";
    



?>

之后,您可以从控制器中获取库,如下所示:

<?php

class Operator extends CI_Controller 

   public function index()
   
       $this->load->library('operator');  
       $this->operator->run();
   


?>

编辑(错误处理)

<?php

class Operator extends CI_Controller 

   public function index()
   
       try 
           $this->load->library('operator');  
           $this->operator->run();
        catch (Exception $e) 
           var_dump($e->getMessage());
       
   


?>

希望这会有所帮助!

【讨论】:

感谢您的帮助,但它给出了空白输出。 你调用的链接是谁,你能粘贴你的PHP日志错误文件吗?我已更新我的帖子以发现错误。 我的日志文件中没有任何内容,整个屏幕都是空白的(白色)。 抱歉,您是否将令牌更改为正确的值?你是什​​么版本的代码点火器?我将在我的本地机器上尝试... 尝试替换这一行:$this->load->library('operator');通过这个:$this->load->library('myoperator');【参考方案2】:

我直接运行这段代码,但是我很困惑在哪里使用这段代码,哪一部分在控制器中,哪一部分在 CodeIgniter 中。

这听起来像是对 CodeIgniter 应用程序结构的快速入门。默认的 CI 3.1.3 版本具有以下结构:

.
├── application/
├── composer.json
├── contributing.md
├── index.php
├── license.txt
├── readme.rst
├── system/
└── user_guide/

您的应用程序,包括您提供的库,将驻留在application 目录中。在您的情况下,“Myoperator”库应放在 application/libraries 中。您的控制器将驻留在application/controllers 中,而视图将驻留在application/views 中。

在您的最终Myoperator.php 文件中,您需要删除示例中的最后两行。这些将被您控制器中的等效项替换。

在您的控制器中,您只需像这样加载库:

$this->load->library('myoperator');

然后像这样调用库:

$this->myoperator->run();

这是最后两行的 CodeIgniter 等效项,$Class = new Myoperator();$Class-&gt;run();

【讨论】:

【参考方案3】:

如果他们提供了任何库,那么您可以通过在控制器文件中包含该库来使用它,然后直接调用他们的函数。 如果他们为您提供了代码,那么您必须创建自己的 api 文件来调用他们的 url。只需将代码粘贴到 web/application/libraries/Operator.php 中(假设库的名称)。

Operator.php

<?php                                                                                   

/**
 * @description : Library to access MyOperator Public API
 */
Class Myoperator 

    protected $developers_url = 'https://developers.myoperator.co/';
    protected $token = 'XXXXXXXXX';

    function __construct() 

    

    public function run() 
        # request for Logs
        $url = $this->developers_url . 'search';
        $fields = array("token" => $this->token);
        $result = $this->_post_api($fields, $url);

        $this->log("result");
        $this->log($result);
    

    private function _post_api(Array $fields, $url) 
        try 
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
            $result = curl_exec($ch);
         catch (Exception $e) 
            return false;
        
        $this->log("url");
        $this->log($url);
        $this->log("fields");
        $this->log($fields);
        curl_close($ch);
        if ($result)
            return $result;
        else
            return false;
    

    private function log($message) 
        print_r($message);
        echo "\n";
    


然后在您的自定义控制器中包含该api并使用它扩展控制器。然后自动调用该api的功能。

require('application/libraries/Operator.php');
class Users extends Operator

    public function __Construct()
    
       $this->run(); /*You can call the function directly using $this*/
    

我不知道api的工作原理,但你可以试试这个方法。我希望它会工作。

【讨论】:

【参考方案4】:

按照以下方向创建您自己的库Application/libraries/ 并粘贴以下代码:

 <?php defined('BASEPATH') OR exit('No direct script access allowed'); Class Myoperator 

protected $developers_url = 'https://developers.myoperator.co/';
protected $token = 'XXXXXXXXX';

function __construct() 



public function run() 
    # request for Logs
    $url = $this->developers_url . 'search';
    $fields = array("token" => $this->token);
    $result = $this->_post_api($fields, $url);

    $this->log("result");
    $this->log($result);


private function _post_api(Array $fields, $url) 
    try 
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        $result = curl_exec($ch);
     catch (Exception $e) 
        return false;
    
    $this->log("url");
    $this->log($url);
    $this->log("fields");
    $this->log($fields);
    curl_close($ch);
    if ($result)
        return $result;
    else
        return false;


private function log($message) 
    print_r($message);
    echo "\n";
  ?>

之后,您可以像这样使用控制器中的库:

  public function index() 
   $this->load->library('operator');  
   $this->operator->run();

错误处理:

public function index()
   try 
       $this->load->library('operator');  
       $this->operator->run();
    catch (Exception $e) 
       var_dump($e->getMessage());
   

【讨论】:

感谢重播,我已经这样做了。但现在我面临的挑战是如何从 json 文件中获取值。 在run函数里面的库文件中,返回json值如下:return json_encode($result);【参考方案5】:

通过使用此代码,我得到了答案,实际上我忘记在我的 Controller 类中包含我的 Admin_controller

我的库文件:

<?php                                                                                   

defined('BASEPATH') OR exit('No direct script access allowed');

//require APPPATH. 'core/Admin_controller.php';

/**
 * @description : Library to access MyOperator Public API
 */
Class MY_Operator 

    protected $developers_url = 'https://developers.myoperator.co/';
    protected $token = 'XXXXXXXXXX';

    function __construct() 

    

    public function run() 
        # request for Logs
        $url = $this->developers_url . 'search';
        $fields = array("token" => $this->token);
        $result = $this->_post_api($fields, $url);

        $this->log("result");
        $this->log($result);
    

    private function _post_api(Array $fields, $url) 
        try 
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
            $result = curl_exec($ch);
         catch (Exception $e) 
            return false;
        
        $this->log("url");
        $this->log($url);
        $this->log("fields");
        $this->log($fields);
        curl_close($ch);
        if ($result)
            return $result;
        else
            return false;
    

    private function log($message) 
        print_r($message);
        echo "\n";
    

这个id控制器代码:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

require APPPATH. 'core/Admin_controller.php';
//Added above line to get output
class Myoperator extends Admin_controller


    public function __construct()
    
        parent::__construct();
        $this->load->library('MY_Operator');
        //$this->load->model('home_model');
    

    public function index()
   
       try 

            $this->my_operator->run();
        catch (Exception $e) 
           var_dump($e->getMessage());
       

       $this->load->view('admin/myoperator/view');
   

已编辑:

这是我正在寻找的以 json 格式提供输出的代码。

【讨论】:

您在哪里拨打json_decode() 电话?我在您引用$result 的库文件中看到。这是您尝试json_decode() 的地方吗?如果是这样,您应该从库中的run() 方法返回$result(或json_decode($result)),然后将控制器的index 方法中的返回值分配给$data['m']。然后您可以通过$this-&gt;load-&gt;view('admin/myoperator/view', $data); 将其传递给视图 实际上,上面的代码给了我输出。抱歉,我没有更新我的答案。 不接受答案并不是很酷(主要是为了赏金),我显然让你走上了正轨!

以上是关于Codeigniter 应用程序中的 API 集成的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 框架下使用 oauth 2 构建保护我的 API

paypal 中的标准工作流程与 PHP codeigniter 集成

将 Twig 与 CodeIgniter 4 集成

codeigniter 类中的 api

集成 Codeigniter 和 Wordpress

集成/迁移两个 CodeIgniter 应用程序。