请教二次开发超级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 页面展示的是有哪些函数及函数的参数有哪些;
这个对应的文档为:http://devel.easycorp.cn/book/extension/api-intro-43.html 两种方法使用其中一个即可,推荐第一种。 2、失败:
|
赵找找 |
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楼的报错信息
|
石洋洋 |
type是任务的类型,这个字段是必填项,可以在禅道的task/model.php 中用a($type);跟踪打印一下 type的值是否存在,再任务类型中是否能找到 devel这个值。
|
赵找找 |
用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" 不知道是哪里配置的问题导致post没有把值传进去呢? |
禅道-Bee |
如果是11.6.4版本的,可以将:zentao/framework/base/router.class.php 598-600行注释下,然后试试呢?
|
赵找找 |
注释掉后type不报错了,看打印type可以取到了,现在报task/model.php里这句的错: 语句:foreach($this->post->assignedTo as $assignedTo) 错误:Invalid argument supplied for foreach() 看文档这个assignedTo不是必填项,但在post中填了也一样报 搜了一下写assignedTo[]就可以了,地址贴不出来,文章名字叫《在禅道项目管理软件v9.8.3的一个API调用bug的排错中使用到的一些工具和分析方法》。
|
禅道-Bee |
assignedTo,传值的时候是个数组。可以再禅道页面先提交数据,f12 调试工具,看下提交的数据格式的。
|