标签存档: api

PHP扩展Coreseek API

Coreseek API下载地址http://www.coreseek.cn/products-install/api-list/

$ wget http://pecl.php.net/get/sphinx-1.2.0.tgz
$ tar -zxvf sphinx-1.2.0.tgz
$ cd sphinx-1.2.0
$ /usr/local/php/bin/phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && make install
#安装PHP扩展之前需要安装libsphinxclient
#报错信息:configure: error: Cannot find libsphinxclient headers
$ cd coreseek-3.2.14/csft-3.2.14/api/libsphinxclient
$ ./configure
$ make && make install
$ /usr/local/apache2/bin/apachectl restart

[转]用CodeIgniter搭建RESTful API

REST (REpresentation State Transfer) 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

用CodeIgniter整合好的RESTful框架:http://github.com/philsturgeon/codeigniter-restserver

请求URL格式:index.php/example_api/user/id/1/format/json。
其中,可以看到这种形式很象CodeIgniter中的MVC架构的链接,但要注意到,传统的CodeIgniter中的有点不同,在链接的最后一部分,我们称为Resource资源。

RESTful架构中的四类关于资源的操作:
GET:使用GET去获得一个已经存在的资源的信息。通常我们在浏览器中输入url其实即发出了一个GET的请求。
POST:使用POST去更新一个已经存在的资源。比如表单中的提交数据行为,都属于POST类型。
PUT:使用HTTP的报文头的PUT,可以去新建一种资源,目前不是所有浏览器支持,所以本文不作讨论。
DELETE:使用DELETE去删除一种资源,同样目前不是所有浏览器都支持。

现在我们可以根据四种HTTP RESTful语义去形成如下框架:

<?php
require(APPPATH'.libraries/REST_Controller.php'); 

class Example_api extends REST_Controller {
    function user_get(){
        // 获得一个用户的信息
        $data = array('returned: '. $this->get('id'));
        $this->response($data);
    }

    function user_post()
    {
        // 更新用户信息
        $data = array('returned: '. $this->post('id'));
        $this->response($data);
    }

    function user_put()
    {
        // 创建一个新用户
        $data = array('returned: '. $this->put('id'));
        $this->response($data);
    }

    function user_delete()
    {
        // 删除用户信息
        $data = array('returned: '. $this->delete('id'));
        $this->response($data);
    }
}
?>

以上代码中包含了如下几个片段,下面逐一讲解:
$this->get() —— 其中,使用这个从形如index.php/example_api/user?id=1或者如index.php/example_api/user/id/1的连接中获得资源,比如这里就获得其id的值,然后在数组中返回该id对应的数值。
$this->post() —— 其实是CodeIgniter中调用了其框架的$this->input->post()方法,进行提交操作,并且利用了XSS保护特性。
$this->put() —— 取curl中提交的或者HTTP协议头的PUT参数的内容。
$this->delete() —— 取curl中提交的或者HTTP协议头的delete参数的内容。
$this->response() —— 个方法中,主要是将处理的数据返回给浏览器,你可以指定一个HTTP状态码去表示该次返回结果的状态,比如在数据库中找不到某个记录,可以使用如$this->response(array(‘error’ => ‘User not found.’)去返回结果。

保护RESTful API

为了保护RESTful API,可以在application/config/rest.php中设置安全保护级别,如下所示:
$config['rest_auth'] = ‘basic’; //默认值为false
1)最简单的调用RESTful:

$user = json_decode(file_get_contents('http://example.com/index.php/api/user/id/1/format/json'));
echo $user->name;

2)要是访问一个受密码保护的RESTful的话,需要用如下形式访问:

$user = json_decode(file_get_contents('http://admin:1234@example.com/index.php/api/user/id/1/format/json'));
echo $user->name;

3)使用cUrl访问RESTful

function native_curl($new_name, $new_email)
{
$username = 'admin';
$password = '1234';

// Alternative JSON version
// $url = 'http://twitter.com/statuses/update.json';
// Set up and execute the curl process
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, 'http://localhost/restserver/index.php/example_api/user/id/1/format/json');
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_POST, 1);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, array(
'name' => $new_name,
'email' => $new_email
));

//本行可选,如果你的RESTful API是开放的,则请删除该行
curl_setopt($curl_handle, CURLOPT_USERPWD, $username . ':' . $password);

$buffer = curl_exec($curl_handle);
curl_close($curl_handle);

$result = json_decode($buffer);

if(isset($result->status) && $result->status == 'success')
{
echo 'User has been updated.';
}
else
{
echo 'Something has gone wrong';
}
}

另外,强大的CodeIgniter为我们封装了更强大的cUrl类库cUrl library(http://codeigniter.com/wiki/Curl_library/),上面的代码可以简化如下:

function ci_curl($new_name, $new_email)
{
$username = 'admin';
$password = '1234';
$this->load->library('curl');
$this->curl->create('http://localhost/restserver/index.php/example_api/user/id/1/format/json');
$this->curl->http_login($username, $password); //本行可选,如果你的RESTful API是开放的,则请删除该行
$this->curl->post(array(
'name' => $new_name,
'email' => $new_email
));
$result = json_decode($this->curl->execute());
if(isset($result->status) && $result->status == 'success')
{
echo 'User has been updated.';
}
else
{
echo 'Something has gone wrong';
}
}
第 1 页,共 1 页1