php基于curl扩展制作跨平台的restfule 接口

   这篇文章主要介绍了php基于curl扩展制作跨平台的restfule 接口的相关资料以及详细的代码,有需要的小伙伴可以参考下。

  restfule 接口

  适用的平台:跨平台

  所依赖:curl扩展

  git:https://git.oschina.net/anziguoer/restAPI

  ApiServer.php

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186

<?php
/**
* @Author: yangyulong
* @Email : anziguoer@sina.com
* @Date: 2015-04-30 05:38:34
* @Last Modified by: yangyulong
* @Last Modified time: 2015-04-30 17:14:11
*/
 
class apiServer
{
/**
* 客户端请求的方式
* @var string
*/
private $method = '';
 
/**
* 客户端发送的数据
* @var [type]
*/
protected $param;
 
/**
* 要操作的资源
* @var [type]
*/
protected $resourse;
 
/**
* 要操作的资源id
* @var [type]
*/
protected $resourseId;
 
 
/**
* 构造函数, 获取client 请求的方式,以及传输的数据
* @param object 可以自定义传入的对象
*/
public function __construct()
{
//首先对客户端的请求进行验证
$this->authorization();
 
$this->method = strtolower($_SERVER['REQUEST_METHOD']);
 
//所有的请求都是pathinfo模式
$pathinfo = $_SERVER['PATH_INFO'];
 
//将pathinfo数据信息映射为实际请求方法
$this->getResourse($pathinfo);
 
//获取传输的具体参数
$this->getData();
 
//执行响应
$this->doResponse();
}
 
/**
* 根据不同的请求方式,获取数据
* @return [type]
*/
private function doResponse(){
switch ($this->method) {
case 'get':
$this->_get();
break;
case 'post':
$this->_post();
break;
case 'delete':
$this->_delete();
break;
case 'put':
$this->_put();
break;
default:
$this->_get();
break;
}
}
 
// 将pathinfo数据信息映射为实际请求方法
private function getResourse($pathinfo){
 
/**
* 将pathinfo数据信息映射为实际请求方法
* GET /users: 逐页列出所有用户;
* POST /users: 创建一个新用户;
* GET /users/123: 返回用户为123的详细信息;
* PUT /users/123: 更新用户123;
* DELETE /users/123: 删除用户123;
*
* 根据以上规则,将pathinfo第一个参数映射为需要操作的数据表,
* 第二个参数映射为操作的id
*/
 
$info = explode('/', ltrim($pathinfo, '/'));
list($this->resourse, $this->resourseId) = $info;
}
 
/**
* 验证请求
*/
private function authorization(){
$token = $_SERVER['HTTP_CLIENT_TOKEN'];
$authorization = md5(substr(md5($token), 8, 24).$token);
if($authorization != $_SERVER['HTTP_CLIENT_CODE']){
//验证失败,输出错误信息给客户端
$this->outPut($status = 1);
}
}
 
/**
* [getData 获取传送的参数信息]
* @param [type] $pad [description]
* @return [type] [description]
*/
private function getData(){
//所有的参数都是get传参
$this->param = $_GET;
}
 
/**
* 获取资源操作
* @return [type] [description]
*/
protected function _get(){
//逻辑代码根据自己实际项目需要实现
}
 
/**
* 新增资源操作
* @return [type] [description]
*/
protected function _post(){
//逻辑代码根据自己实际项目需要实现
}
 
/**
* 删除资源操作
* @return [type] [description]
*/
protected function _delete(){
//逻辑代码根据自己实际项目需要实现
}
 
/**
* 更新资源操作
* @return [type] [description]
*/
protected function _put(){
//逻辑代码根据自己实际项目需要实现
}
 
/**
* 出入服务端返回的数据信息 json格式
*/
public function outPut($stat, $data=array()){
$status = array(
//0 状态表示请求成功
0 => array(
'code' => 1,
'info' => '请求成功',
'data' =>$data
),
//验证失败
1 => array(
'code' => 0,
'info' => '请求不合法'
)
);
 
try{
if(!in_array($stat, array_keys($status))){
throw new Exception('输入的状态码不合法');
}else{
echo json_encode($status[$stat]);
}
}catch (Exception $e){
die($e->getMessage());
}
}
}

  ApiClient.php

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

<?php
 
/**
* Created by PhpStorm.
* User: anziguoer@sina.com
* Date: 2015/4/29
* Time: 12:36
* link: http://www.ruanyifeng.com/blog/2014/05/restful_api.html [restful设计指南]
*/
/*** * * * * * * * * * * * * * * * * * * * * * * * * * ***
* 定义路由的请求方式 *
* *
* $url_model=0 *
* 采用传统的URL参数模式 *
* http://serverName/appName/?m=module&a=action&id=1 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* PATHINFO模式(默认模式) *
* 设置url_model 为1 *
* http://serverName/appName/module/action/id/1/ *
** * * * * * * * * * * * * * * * * * * * * * * * * * * **
*/
class restClient
{
//请求的token
const token='yangyulong';
 
//请求url
private $url;
 
//请求的类型
private $requestType;
 
//请求的数据
private $data;
 
//curl实例
private $curl;
 
public $status;
 
private $headers = array();
/**
* [__construct 构造方法, 初始化数据]
* @param [type] $url 请求的服务器地址
* @param [type] $requestType 发送请求的方法
* @param [type] $data 发送的数据
* @param integer $url_model 路由请求方式
*/
public function __construct($url, $data = array(), $requestType = 'get') {
 
//url是必须要传的,并且是符合PATHINFO模式的路径
if (!$url) {
return false;
}
$this->requestType = strtolower($requestType);
$paramUrl = '';
// PATHINFO模式
if (!empty($data)) {
foreach ($data as $key => $value) {
$paramUrl.= $key . '=' . $value.'&';
}
$url = $url .'?'. $paramUrl;
}
 
//初始化类中的数据
$this->url = $url;
 
$this->data = $data;
try{
if(!$this->curl = curl_init()){
throw new Exception('curl初始化错误:');
};
}catch (Exception $e){
echo '<pre>';
print_r($e->getMessage());
echo '</pre>';
}
 
curl_setopt($this->curl, CURLOPT_URL, $this->url);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
 
}
 
/**
* [_post 设置get请求的参数]
* @return [type] [description]
*/
public function _get() {
 
}
 
/**
* [_post 设置post请求的参数]
* post 新增资源
* @return [type] [description]
*/
public function _post() {
 
curl_setopt($this->curl, CURLOPT_POST, 1);
 
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $this->data);
 
}
 
/**
* [_put 设置put请求]
* put 更新资源
* @return [type] [description]
*/
public function _put() {
 
curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, 'PUT');
}
 
/**
* [_delete 删除资源]
* delete 删除资源
* @return [type] [description]
*/
public function _delete() {
curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
 
}
 
/**
* [doRequest 执行发送请求]
* @return [type] [description]
*/
public function doRequest() {
//发送给服务端验证信息
if((null !== self::token) && self::token){
$this->headers = array(
'Client_Token: '.self::token,
'Client_Code: '.$this->setAuthorization()
);
}
 
//发送头部信息
$this->setHeader();
 
//发送请求方式
switch ($this->requestType) {
case 'post':
$this->_post();
break;
 
case 'put':
$this->_put();
break;
 
case 'delete':
$this->_delete();
break;
 
default:
curl_setopt($this->curl, CURLOPT_HTTPGET, TRUE);
break;
}
//执行curl请求
$info = curl_exec($this->curl);
 
//获取curl执行状态信息
$this->status = $this->getInfo();
return $info;
}
 
/**
* 设置发送的头部信息
*/
private function setHeader(){
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->headers);
}
 
/**
* 生成授权码
* @return string 授权码
*/
private function setAuthorization(){
$authorization = md5(substr(md5(self::token), 8, 24).self::token);
return $authorization;
}
/**
* 获取curl中的状态信息
*/
public function getInfo(){
return curl_getinfo($this->curl);
}
 
/**
* 关闭curl连接
*/
public function __destruct(){
curl_close($this->curl);
}
}

  testClient.php

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

<?php
/**
* Created by PhpStorm.
* User: anziguoer@sina.com
* Date: 2015/4/29
* Time: 12:35
*/
 
include './ApiClient.php';
 
$arr = array(
'user' => 'anziguoer',
'passwd' => 'yangyulong'
);
// $url = 'http://localhost/restAPI/restServer.php';
$url = 'http://localhost/restAPI/testServer.php/user/123';
 
$rest = new restClient($url, $arr, 'get');
$info = $rest->doRequest();
 
//获取curl中的状态信息
$status = $rest->status;
echo '<pre>';
print_r($info);
echo '</pre>';

  testServer.php

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

<?php
/**
* @Author: anziguoer@sina.com
* @Email: anziguoer@sina.com
* @link: https://git.oschina.net/anziguoer
* @Date: 2015-04-30 16:52:53
* @Last Modified by: yangyulong
* @Last Modified time: 2015-04-30 17:26:37
*/
 
include './ApiServer.php';
 
class testServer extends apiServer
{
/**
* 先执行apiServer中的方法,初始化数据
* @param object $obj 可以传入的全局对象[数据库对象,框架全局对象等]
*/
 
private $obj;
 
function __construct()//object $obj
{
parent::__construct();
//$this->obj = $obj;
//$this->resourse; 父类中已经实现,此类中可以直接使用
//$tihs->resourseId; 父类中已经实现,此类中可以直接使用
}
 
/**
* 获取资源操作
* @return [type] [description]
*/
protected function _get(){
echo "get";
//逻辑代码根据自己实际项目需要实现
}
 
/**
* 新增资源操作
* @return [type] [description]
*/
protected function _post(){
echo "post";
//逻辑代码根据自己实际项目需要实现
}
 
/**
* 删除资源操作
* @return [type] [description]
*/
protected function _delete(){
//逻辑代码根据自己实际项目需要实现
}
 
/**
* 更新资源操作
* @return [type] [description]
*/
protected function _put(){
echo "put";
//逻辑代码根据自己实际项目需要实现
}
}
 
$server = new testServer();

  以上所述就是本文的全部内容了,希望大家能够喜欢。

时间: 2024-09-14 21:12:13

php基于curl扩展制作跨平台的restfule 接口的相关文章

php基于curl扩展制作跨平台的restfule 接口_php实例

restfule 接口 适用的平台:跨平台 所依赖:curl扩展 git:https://git.oschina.net/anziguoer/restAPI ApiServer.php <?php /** * @Author: yangyulong * @Email : anziguoer@sina.com * @Date: 2015-04-30 05:38:34 * @Last Modified by: yangyulong * @Last Modified time: 2015-04-30

php基于curl主动推送最新内容给百度收录的方法_php技巧

本文实例讲述了php基于curl主动推送最新内容给百度收录的方法.分享给大家供大家参考,具体如下: php curl的好处可以以最快的方式并且模仿post提供我们的url地址给百度搜索引擎进行收录. 百度链接提交三种方式: 1.主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录. 2.sitemap:您可以定期将网站链接放到sitemap中,然后将sitemap提交给百度.百度会周期性的抓取检查您提交的sitemap,对其中的链接进行

基于SharpMap扩展程序开发实例

SharpMap是基于.Net平台开发的GIS地图渲染组件.在SharpMap的内部设计了基于OGC 标准的几何模型 构架,设计了IProvider策略模式的多源矢量地图数据适配器接口,地图要素渲染的底层主要通过几何变 换将Geometry转换为.Net支持的几何模型如System.Drawing.Point.System.Drawing.Rectangle. System.Drawing.Drawing2D.GraphicsPath等,然后调用System.Drawing.Graphics类的

linux中php如何安装CURL扩展方法示例教程

  如果php已经在系统编译好,后来又需要添加新的扩展. 一种方式就是重新完全编译php,另一种方式就是单独编译扩展库,以extension的形式扩展. 下面以安装curl扩展为例: 1.下载curl安装包.(我的php是4.4.4的,下载最新的curl 7.16 不能使用,最后下载7.14的才可以,所以要注意一下版本问题) 代码如下: ./configure make php要求curl的目录要有include和lib目录,并且include下要有easy.h 和curl.h两个文件,lib下

开启CURL扩展,让服务器支持PHP curl函数(远程采集)

curl().file_get_contents().snoopy.class.php这三个远程页面抓取或采集中用到的工具,默迹还是侵向于用snoopy.class.php,因为他效率比较高且不需要服务器特定配置支持,在普通虚拟主机中即可使用,file_get_contents()效率稍低些,常用失败的情况.curl()效率挺高的,支持多线程,不过需要开启下curl扩展.下面是curl扩展开启的步骤: 1.将PHP文件夹下的三个文件php_curl.dll,libeay32.dll,ssleay

linux中php如何安装CURL扩展方法

  如果php已经在系统编译好,后来又需要添加新的扩展. 一种方式就是重新完全编译php,另一种方式就是单独编译扩展库,以extension的形式扩展. 下面以安装curl扩展为例: 1.下载curl安装包.(我的php是4.4.4的,下载最新的curl 7.16 不能使用,最后下载7.14的才可以,所以要注意一下版本问题) ./configure make php要求curl的目录要有include和lib目录,并且include下要有easy.h 和curl.h两个文件,lib下要有libc

在PHP中开启CURL扩展,使其支持curl()函数

  在用PHP开发CMS的时候,要用到PHP的curl函数,默认状态下,这个函数需要开启CURL扩展,有主机使用权的,可通过PHP.ini文件开启本扩展,方法如下: 1.打开php.ini,定位到;extension=php_curl.dll,将其前面的;去掉. 2.将PHP目录下ext目录中的:php_curl.dll.libeay32.dll和ssleay32.dll三个文件复制到系统system32目录下,重启IIS或apache. 3.为了确保是否已开启CURL扩展,可通过下述代码进行测

开启CURL扩展,让服务器支持PHP curl函数(远程采集)_php技巧

curl().file_get_contents().snoopy.class.php这三个远程页面抓取或采集中用到的工具,默迹还是侵向于用snoopy.class.php,因为他效率比较高且不需要服务器特定配置支持,在普通虚拟主机中即可使用,file_get_contents()效率稍低些,常用失败的情况.curl()效率挺高的,支持多线程,不过需要开启下curl扩展.下面是curl扩展开启的步骤: 1.将PHP文件夹下的三个文件php_curl.dll,libeay32.dll,ssleay

PHP基于CURL进行POST数据上传实例_php实例

本文实例讲述了PHP基于CURL进行POST数据上传的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: ////二维码 $QRCode_URL="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$ACC_TOKEN;    $data ='{"expire_seconds": 1800, "action_name": "QR_SCENE&q