请教二次开发超级model接口调用post发送数据方式,新建任务为例

2019-10-30 10:00:05
赵找找
  • 访问次数: 14
  • 注册日期: 2016-02-26
  • 最后登录: 2020-04-26
  • 我的积分: 62
  • 门派等级: 玄清 等级1 居士

按照说明文档构造URL为:

http://127.0.0.1/zentao/api.php?m=api&f=getModel&module=task&methodName=create&params=projectID=2&code=zabbix&time=1572400076&token=af258bfdd13a2db2b2de4a5d868df506

使用postman发送post参数

结果显示status:fail。请问是何原因,url构造或者post参数有问题否?


沙发
2019-10-30 14:04:23
赵找找
  • 访问次数: 14
  • 注册日期: 2016-02-26
  • 最后登录: 2020-04-26
  • 我的积分: 62
  • 门派等级: 玄清 等级1 居士

1、url的格式对吗?是以api中的格式为准,还是编辑器中的格式?

2、参数是传输普通参数,还是json?(两种都试了,报一样的错)

3、json格式需要加data:{ }否?

板凳
2019-10-30 17:58:03
石洋洋
  • 访问次数: 6467
  • 注册日期: 2011-04-06
  • 最后登录: 2024-04-25
  • 我的积分: 96555
  • 门派等级: 幽灵 等级6 修罗

1、调用格式以 api调用文档中的介绍格式为准,后台-二次开发-api 页面展示的是有哪些函数及函数的参数有哪些;

  • 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开头的文件。
  • 如果是创建编辑,检查一下必填项是否都填写了。
3、函数的参数直接按照上面的调用网址拼装,post的数据可以参考浏览器post数据的格式进行拼装,。
#3
2019-10-31 11:07:46
赵找找
  • 访问次数: 14
  • 注册日期: 2016-02-26
  • 最后登录: 2020-04-26
  • 我的积分: 62
  • 门派等级: 玄清 等级1 居士

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


赵找找 最后编辑, 2019-10-31 11:08:23
#4
2019-10-31 13:16:05
赵找找
  • 访问次数: 14
  • 注册日期: 2016-02-26
  • 最后登录: 2020-04-26
  • 我的积分: 62
  • 门派等级: 玄清 等级1 居士

这是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

#5
2019-10-31 15:35:07
赵找找
  • 访问次数: 14
  • 注册日期: 2016-02-26
  • 最后登录: 2020-04-26
  • 我的积分: 62
  • 门派等级: 玄清 等级1 居士

试了下相同的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楼的报错信息

赵找找 最后编辑, 2019-10-31 16:57:20
#6
2019-10-31 17:41:36
石洋洋
  • 访问次数: 6467
  • 注册日期: 2011-04-06
  • 最后登录: 2024-04-25
  • 我的积分: 96555
  • 门派等级: 幽灵 等级6 修罗
type是任务的类型,这个字段是必填项,可以在禅道的task/model.php 中用a($type);跟踪打印一下 type的值是否存在,再任务类型中是否能找到 devel这个值。
#7
2019-11-01 16:33:26
赵找找
  • 访问次数: 14
  • 注册日期: 2016-02-26
  • 最后登录: 2020-04-26
  • 我的积分: 62
  • 门派等级: 玄清 等级1 居士

用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没有把值传进去呢?

赵找找 最后编辑, 2019-11-01 16:34:08
#8
2019-11-01 17:42:22
禅道-Bee
  • 访问次数: 5117
  • 注册日期: 2017-02-22
  • 最后登录: 2024-04-25
  • 我的积分: 41113
  • 门派等级: 幽灵 等级5 天魔
如果是11.6.4版本的,可以将:zentao/framework/base/router.class.php 598-600行注释下,然后试试呢?
#9
2019-11-05 13:48:40
赵找找
  • 访问次数: 14
  • 注册日期: 2016-02-26
  • 最后登录: 2020-04-26
  • 我的积分: 62
  • 门派等级: 玄清 等级1 居士

注释掉后type不报错了,看打印type可以取到了,现在报task/model.php里这句的错:

语句:foreach($this->post->assignedTo as $assignedTo)

错误:Invalid argument supplied for foreach()

看文档这个assignedTo不是必填项,但在post中填了也一样报

搜了一下写assignedTo[]就可以了,地址贴不出来,文章名字叫《在禅道项目管理软件v9.8.3的一个API调用bug的排错中使用到的一些工具和分析方法》。


赵找找 最后编辑, 2019-11-05 14:54:40
#10
2019-11-05 14:51:55
禅道-Bee
  • 访问次数: 5117
  • 注册日期: 2017-02-22
  • 最后登录: 2024-04-25
  • 我的积分: 41113
  • 门派等级: 幽灵 等级5 天魔
assignedTo,传值的时候是个数组。可以再禅道页面先提交数据,f12 调试工具,看下提交的数据格式的。
1/2 1 2