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->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->load->view('admin/myoperator/view', $data);
将其传递给视图
实际上,上面的代码给了我输出。抱歉,我没有更新我的答案。
不接受答案并不是很酷(主要是为了赏金),我显然让你走上了正轨!以上是关于Codeigniter 应用程序中的 API 集成的主要内容,如果未能解决你的问题,请参考以下文章
在 codeigniter 框架下使用 oauth 2 构建保护我的 API