api机制简介

2014-09-01 18:20:22
王春生
26880
最后编辑:王春生 于 2016-06-29 10:23:45
简介:zentaoPHP还提供了API机制,方便大家来和其他的系统进行集成。

一、API机制介绍:

前面章节讲述的扩展机制是需要直接开发PHP或者html, css, js等代码。zentaoPHP还提供了API机制,方便大家来和其他的系统进行集成。

API机制都是基于http协议的。返回的数据以json格式存储。

zentaoPHP架共实现了两种API机制。一种为直接的页面调用,一种通过超级model调用接口,直接调用model层的方法,下面我们一一来看下。

二、页面直接调用

当你访问使用zentaoPHP开发的页面时,将访问的url地址中的html换成json,得到的就是json格式的数据。

比如http://pms.zentao.net/project-task-8.html,返回的网页格式,把后面的.html改成.json,返回的是什么?对了,返回的是json格式的数据。

如果是GET 方式,那么只需要将t参数改成json,http://pms.zentao.net/?m=project&f=task&t=json。


返回的数据是做了两次json_encode,下面是代码的示例:

$result = file_get_contents('http://pms.zentao.net/project-task-8.json'); 
$result = json_decode($($result);
if($result->result == 'success' and md5($result->data) == $result->md5)
{
    $data = json_decode($result->data);
    print_r($data);
}

先判断第一层里面的result是否正确,md5签名是否正确,然后再对data对象进行json_decode。

1.2.2 超级model调用接口

页面的调用,存在一定的局限,比如返回的数据可能没有你想要的,或者返回了你不需要的数据。为此,我们特地准备了一个超级model调用接口。该接口的使用方式:


首先要为相应的帐号增加超级model调用接口的访问权限。

然后就可以通过api模块的getModel方法,获取任意模块的model的公开方法了。

getModel方法需要三个参数,分别是模块名,方法名,然后是该方法的参数列表,key1=value1,key2=value2这种方式,多个参数之间用英文逗号隔开。


以调用bug模块的getUserBugPairs()方法为例:

GET方式调用: ?m=api&f=getModel&module=bug&methodName=getUserBugPairs&params=account=$account

PATH_INFO方式:api-getmodel-bug-getUserBugPairs-account=$account.json

备注:

超级model调用方法暂时只有禅道项目管理软件实现。蝉知门户和然之协同暂时还没有实现。

评论列表
水岸 2018-11-30 10:42:45
您好,请问如何获取禅道提供的RestAPi 的完整列表呢,如果一项一项点然后做统计工作量有点大,是否有外部调用Api的文档呢(类似功能,接口(出入参)的对照表)
水岸 2018-11-30 10:45:09
我并不是java开发对php不是很了解,是否有易于理解的可供远程调用的API文档呢
王春生 2018-12-03 13:35:16
后台,二次开发。
2018-10-14 17:31:41
你好
我用python requests去创建用户,用的/zentao/user-create-36.json?account=testuser&password=123456,返回了成功,但是没有加上,请问下,是哪里还有问题?
王春生 2018-10-16 09:24:32
使用POST方式。
liu 2018-10-24 16:52:31
我是post请求的,requests.post('http://xxxx/zentao/user-create-3.json?account=testuser&password=123456&realname=testuser',auth=('user','password')) 还是无法创建
王春生 2018-10-25 14:56:48
post请求的表单不是这样创建的。
limbo 2018-10-09 14:29:41
在通过API调用resolve bug的时候,怎样填写message信息?
王春生 2018-10-11 06:57:42
变量参考我们的表单。
Harry Zhang 2018-05-24 19:35:10
“”首先要为相应的帐号增加超级model调用接口的访问权限。”
这句话是什么意思?
如果想跳过登录应该处理那块的逻辑呢?盼回复!
王春生 2018-05-25 10:43:19
可以在common模块里面的isOpenMethod配置。
Harry Zhang 2018-05-25 10:49:49
谢谢!
zjd 2018-05-09 16:33:34
您好,我调用您提供的示例,加上我自己的虚拟站点,整个url是这样的,http://www.cd.com?m=api&f=getModel&module=bug&methodName=getUserBugPairs,在postman上send后json返回的数据是这个样子,‘Unexpected '<'’,请问我的方法哪错了吗
xxy 2018-05-02 14:09:45
我尝试用python requests调用/zentaopms/www/index.php?m=bug&f=export&productID=114&orderBy=id_desc导出bug,但一直不成功,不知道是不是post data没有传递成功,能否指导一下,如下是报错信息:
<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></head><body><br />
14:08:37 ERROR: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'oRdEr bY `id` desc' at line 1<p>The sql is: SELECT * FROM `zt_bug` wHeRe oRdEr bY `id` desc </p> in D:\xampp\htdocs\zentaopms\lib\base\dao\dao.class.php on line 1318, last called by D:\xampp\htdocs\zentaopms\lib\base\dao\dao.class.php on line 717 through function sqlError.<br />
in <strong>D:\xampp\htdocs\zentaopms\framework\base\router.class.php</strong> on line <strong>1932</strong> when visiting <strong>/zentaopms/www/index.php?m=bug&f=export&productID=114&orderBy=id_desc</strong><br />
</body></html>

王春生 2018-05-03 09:09:20
导出bug前提是需要有一个检索条件的。这个检索条件是通过列表的浏览,搜索等方式产生,然后存在session里面的。
master 2018-04-20 10:22:11
弱弱地问下,基于超级model调用方式,我怎么知道有哪些model,哪些methodName呢?
王春生 2018-04-24 13:19:21
看每个模块下面的model.php
nancy 2018-04-10 12:33:58
请教,我在view.html.php里边用inlink的方式生成a标签的地址串,用来让用户可以点击之后使得当前页面的数据重新进行查询和加载,因此需要给地址串传递多个值。我应该用什么方式把这些参数连接起来呢?英文逗号分隔,&进行连接,甚至于用(点).进行连接我都试了,全部都不行啊。

//点连接的方式
$vars = "costType=$reimType"."account=''"."status='wait'";
//&符号链接的方式
$vars = "costType=$reimType&account=''&status='wait'";
//英文逗号分隔的方式
$vars = "costType=$reimType,account='',status='wait'";

我生成a标签link的语句是:
echo "<li id='reimHis'>" . html::a(inlink('todo', $vars),$lang->todo->history) . '</li>';
nancy 2018-04-10 14:58:40
找到解决办法了。用<?php

echo html::a(helper::createLink('todo', 'history', "type=&account=&status=done&orderBy=$orderBy&recTotal=$recTotal&recperpage=50&pageID=$pageID"), "<i class='icon-download-alt'></i> " . $lang->todo->history, '', "class='btn'")?>
这种写法就可以,而且好像必须把这个语句单独放在<?php ?>.这是为什么呢?
ss 2018-03-24 16:24:54
嗨,你好,我最近写了一个接口,外部调用获取数据用的,post形式的,但用postman去请求接口时候,body只能使用x-www-form-urlencoded,而不能用raw的json格式,这是为什么呢
王春生 2018-03-26 09:11:31
主要要看程序如何处理。你传json格式的,程序能识别处理也都可以的。
ws 2018-03-26 10:24:24
不是,我是想问是不是禅道框架的问题,写出来的post的接口都是这样的,不能直接用raw的json格式请求,还是说我处理的不对
王春生 2018-03-26 10:36:48
和框架没有关系的。你按照我们的表单方式提交,php可以直接处理为$_POST变量。如果你要用raw json格式的,需要你自己额外写程序读取http协议的body,然后自己分析处理。
你好 2018-03-26 10:59:40
您好,我感觉你没太明白我的意思,请问你用禅道写的提供给外部的post方式的接口是正常的吗,但是为啥postman请求的时候,不是raw的json格式,平时写的接口默认都是这个形式的,这个不需要自己去处理吧
罗罗 2018-03-19 19:57:32
host/index.php?m=my&f=bug&type=assignedTo&sid=o0lap6ljpaam7qropp18adln40 后,返回ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'o0lap6ljpaam7qropp18adln40' in 'order clause'&lt;p&gt;The sql is: SELECT * FROM `zt_bug` wHeRe deleted = '0' AND `assignedTo` = ‘xx’。
无法取出想要的结果
王春生 2018-03-20 16:51:53
错误非常明显。
1/3
发表评论
评论通过审核后显示。