请教二次开发超级model接口调用post发送数据方式,新建任务为例
按照说明文档构造URL为:
http://127.0.0.1/zentao/api.php?m=api&f=getModel&module=task&methodName=create¶ms=projectID=2&code=zabbix&time=1572400076&token=af258bfdd13a2db2b2de4a5d868df506
使用postman发送post参数
结果显示status:fail。请问是何原因,url构造或者post参数有问题否?
1、url的格式对吗?是以api中的格式为准,还是编辑器中的格式?
2、参数是传输普通参数,还是json?(两种都试了,报一样的错)
3、json格式需要加data:{ }否?
1、调用格式以 api调用文档中的介绍格式为准,后台-二次开发-api 页面展示的是有哪些函数及函数的参数有哪些;
- api调用方法一:http://127.0.0.1/zentao/api.php?m=api&f=getModel&module=task&methodName=create¶ms=projectID=2&code=zabbix&time=1572400076&token=af258bfdd13a2db2b2de4a5d868df506 这种调用方式对应文档为:http://www.zentao.net/book/zentaopmshelp/integration-287.html
-
api调用方法二:
这个对应的文档为:http://devel.easycorp.cn/book/extension/api-intro-43.html
两种方法使用其中一个即可,推荐第一种。
2、失败:
-
找一下禅道的php日志,看看有什么记录:zentao(pro/ep/pms)/config/my.php中debug的值改成true 重新操作一下 看日志文件 zentao(pms/ep/pro)/tmp/log/php开头的今天的文件有什么报错。注:不要找sql开头的文件。
- 如果是创建编辑,检查一下必填项是否都填写了。
Undefined property: stdClass::$type in module\task\model.php on line 52 when visiting /zentao/api.php?m=api&f=getModel&module=task&methodName=create&params=projectID=2&
code=zabbix&time=1572491195&token=6b384b29bac0a86c4be623a761d5d818
Invalid argument supplied for foreach() in module\task\model.php on line 54 when visiting /zentao/api.php?m=api&f=getModel&module=task&methodName=create&params=projectID=2&
code=zabbix&time=1572491195&token=6b384b29bac0a86c4be623a761d5d818
这是post文件的形式
用wireshark抓包,提交数据类型是multipart/form-data,数据以 boundary 开始, 紧接着换行,接着内容描述信息, 接着换2行, 接着是数据; 然后以 --boundary-- 结尾, 最后换行
MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "----WebKitFormBoundarySYQ54UExTqY1Q1Ca"
[Type: multipart/form-data]First boundary: ------WebKitFormBoundarySYQ54UExTqY1Q1Ca\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="project"\r\n\r\n
Data (1 byte)
Boundary: \r\n------WebKitFormBoundarySYQ54UExTqY1Q1Ca\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="type"\r\n\r\n
Data (5 bytes)
Boundary: \r\n------WebKitFormBoundarySYQ54UExTqY1Q1Ca\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="module"\r\n\r\n
Data (2 bytes)
。。。。
。。。。
Last boundary: \r\n------WebKitFormBoundarySYQ54UExTqY1Q1Ca--\r\n试了下相同的url,待办(todo)和需求(story)相应的model超级接口都是可以的,就是任务(task)这个不行,log提示就是3楼的信息,提示type属性未定义。是不是接口这块有问题。
相同的form-data 使用第二种url /zentao/task-create-1-1-3.json?zentaosid=0FCA9334BA6B529961C367C600168C67&t=json。就可以成功
直接在后台-二次开发-编辑器-任务里调用create api就会的到3楼的报错信息
用var_dump($task);跟踪了下,应该是post数据没有解析进来。使用postman,发送选择form-data,设置Content-Type=multipart/form-data。用wireshark抓包工具看,除了封装是数字码,不是webkitformboundarys外没别的区别(和4楼的禅道web发送的数据包对比)
MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "--------------------------647570923192721642361879"
[Type: multipart/form-data]
First boundary: ----------------------------647570923192721642361879\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="type"\r\n\r\n
Data (5 bytes)
Data: 646576656c
[Length: 5]
Boundary: \r\n----------------------------647570923192721642361879\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="project"\r\n\r\n
Data (1 byte)
Data: 32
[Length: 1]
Boundary: \r\n----------------------------647570923192721642361879\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="module"\r\n\r\n
Data (2 bytes)
Data: 3130
[Length: 2]
Boundary: \r\n----------------------------647570923192721642361879\r\n
不知道是哪里配置的问题导致post没有把值传进去呢?
注释掉后type不报错了,看打印type可以取到了,现在报task/model.php里这句的错:
语句:foreach($this->post->assignedTo as $assignedTo)
错误:Invalid argument supplied for foreach()
看文档这个assignedTo不是必填项,但在post中填了也一样报
搜了一下写assignedTo[]就可以了,地址贴不出来,文章名字叫《在禅道项目管理软件v9.8.3的一个API调用bug的排错中使用到的一些工具和分析方法》。