在php中使用cURL为JIRA中的问题添加注释

时间:2013-09-20 20:37:41

标签: php curl jira jira-rest-api

受到using CURL in PHP to add an issue in JIRA via REST API的启发,我试图在JIRA中为一个问题添加评论,但我收到了405错误

错误: 注意:使用未定义的常量CURL_HEADER - 假设为'CURL_HEADER' 警告:curl_setopt_array():数组键必须是CURLOPT常量或等效的整数值 HTTP状态405 - 不允许的方法 类型状态报告 消息方法不允许 description对于请求的资源,不允许使用指定的HTTP方法(Method Not Allowed)。

我的代码:

<?php  
$handle=curl_init();
$headers = array(
    'Accept: application/json',
    'Content-Type: application/json'
);

$data = <<<JSON
{
    "body": "Please Ignore. Test Comment"
}
JSON;
curl_setopt_array(
    $handle,
    array(
        CURLOPT_URL=>'https://path.to.Jira/rest/api/2/issue/issue-123',
        CURLOPT_POST=>true,
        //CURLOPT_HTTPGET =>true,
        CURLOPT_VERBOSE=>1,
        CURLOPT_POSTFIELDS=>$data,
        CURLOPT_SSL_VERIFYHOST=> 0,
        CURLOPT_SSL_VERIFYPEER=> 0,
        CURLOPT_RETURNTRANSFER=>true,
        CURL_HEADER=>false,
        CURLOPT_HTTPHEADER=> $headers,
        CURLOPT_USERPWD=>"username:password"
        //CURLOPT_CUSTOMREQUEST=>"POST"
    )
);
$result=curl_exec($handle);
$ch_error = curl_error($handle);

if ($ch_error) {
    echo "cURL Error: $ch_error";
} else {
    echo $result;
}

curl_close($handle);
?>

这个错误的可能解决方案是什么?

2 个答案:

答案 0 :(得分:1)

尽管Borislav的回答针对的是你的问题的“症状”,但是OP正在经历的两个cURL错误的简单回答是这个常数:

CURL_HEADER输入错误...应该是:

CURLOPT_HEADER

所有cURL选项常量都有 CURLOPT - 作为前缀。请参阅PHP manual - cURL Transfer options并向下滚动查看常量。

进一步解释错误追踪:

第一个错误:

  

注意:使用未定义的常量CURL_HEADER - 假定为'CURL_HEADER'

意味着PHP无法识别CURL_HEADER,只是因为这是一个错字

这对curl_setopt_array()函数有多米诺骨牌效应。因为上面的常量输入错误/拼写错误,所以整个函数失败并返回false,如 curl_setopt_array()上的PHP手册:“如果无法成功设置选项,则立即返回FALSE返回,忽略选项数组“

中的任何未来选项
  

警告:curl_setopt_array():数组键必须是CURLOPT常量或等效整数值

看到该函数如何返回false,没有设置cURL选项。但是你的脚本继续执行,没有所需的信息进入cURL的HTTP请求...和BOOM!

  

HTTP状态405 - 不允许的方法;请求的资源不允许使用指定的HTTP方法。

JIRA API会向您发出405响应,因为HTTP请求不符合其要求。

所有因为常数中缺少3个字母:“CURL OPT _HEADER”

这就是为什么编程很有趣:D

答案 1 :(得分:0)

在:

  

注意:使用未定义的常量CURL_HEADER - 假定为'CURL_HEADER'

表示PHP无法将CURL_HEADER识别为常量。也许你的版本已经老了?或者你输入错误,或者它不存在。的:

  

警告:curl_setopt_array():数组键必须是CURLOPT常量或等效整数值

表示您传递给curl_set_opt($param1, $param2)的参数的结构错误,并且:

  

HTTP状态405 ...... Blah,Blah

意味着所说的内容:服务器正在返回HTTP 405 Method Not Allowed

此外,纯cUrl会引起很多麻烦,如果你正在开发一个连接到JIRA的全栈应用程序,那将很难。 我个人完成了一个功能齐全的应用程序,它使用cUrl连接到(所有)JIRA REST端点,然后使用Guzzle连接到基于cUrl的库。 相信我 - 开发和(更重要的)维护会更容易。

因此,如果您可以选择更改方法,我建议您立即切换到Guzzle。 ;)

如果您正在使用composer(您应该这样做;)),请将以下内容添加到项目根目录中的composer.json文件中:

{
    "require": {
        "guzzle/guzzle": "~3.1.1"
    }
}

然后:

composer.phar install

PEAR安装也是一个选项:

pear -D auto_discover=1 install guzzlephp.org/pear/guzzle

当然,您也可以include the guzzle.phar

查看Guzzle docs以获取更多信息。

干杯!