前段时间给自己Discuz!x3.2论坛开发客户端,自己就研究了下discuz的api的接口和流程,记录下一些重要的点。
api的入口文件,为根目录下的api.php,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
define(
'IN_API'
,true);
//定义api标识
define(
'CURSCRIPT'
,
'api'
);
//定义CURSCRIPT常量
$modarray
=
array
(
'js'
=>
'javascript/javascript'
,
'ad'
=>
'javascript/advertisement'
);
$mod
=!
empty
(
$_GET
[
'mod'
])?
$_GET
[
'mod'
]:
''
;
if
(
empty
(
$mod
)||!in_array(
$mod
,
array
(
'js'
,
'ad'
))){
exit
(
'AccessDenied'
);
}
require_once
'./api/'
.
$modarray
[
$mod
].
'.php'
;
//包含对应php文件
function
loadcore(){
global
$_G
;
require_once
'./source/class/class_core.php'
;
$discuz
=C::app();
$discuz
->init_cron=false;
$discuz
->init_session=false;
$discuz
->init();
}
?>
|
该文件最后包含根目录下api/mobile/下的文件,源码中该文件夹里只有一个index.php文件:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
if
(!
empty
(
$_SERVER
[
'QUERY_STRING'
])){
$plugin
=!
empty
(
$_GET
[
'oem'
])?
'mobileoem'
:
'mobile'
;
$dir
=
'../../source/plugin/'
.
$plugin
.
'/'
;
chdir
(
$dir
);
if
((isset(
$_GET
[
'check'
])&&
$_GET
[
'check'
]==
'check'
||
$_SERVER
[
'QUERY_STRING'
]==
'check'
)&&
is_file
(
'check.php'
)){
require_once
'check.php'
;
}
elseif
(
is_file
(
'mobile.php'
)){
require_once
'mobile.php'
;
}
}
?>
|
可以看出,是想包含/source/plugin/mobile/mobile.php的逻辑,所以可以索性直接在api.php中包含mobile的逻辑即可,修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
define(
'IN_API'
,true);
define(
'CURSCRIPT'
,
'api'
);
$module
=!
empty
(
$_GET
[
'module'
])?
$_GET
[
'module'
]:
''
;
if
(
empty
(
$module
)){
exit
(
'AccessDenied'
);
}
chdir
(
'source/plugin/mobile/'
);
if
((isset(
$_GET
[
'check'
])&&
$_GET
[
'check'
]==
'check'
||
$_SERVER
[
'QUERY_STRING'
]==
'check'
)&&
is_file
(
'check.php'
)){
require_once
'check.php'
;
}
elseif
(
is_file
(
'mobile.php'
)){
require_once
'mobile.php'
;
}
function
loadcore(){
global
$_G
;
require_once
'./source/class/class_core.php'
;
$discuz
=C::app();
$discuz
->init_cron=false;
$discuz
->init_session=false;
$discuz
->init();
}
?>
|
如果请求包含了check,则包含check.php代码,否则直接包含mobile.php的逻辑,即客户端的处理逻辑。