1

受到在 PHP 中使用 CURL 通过 REST API 在 JIRA 中添加问题的启发,我尝试在 JIRA 中添加评论,但出现 405 错误

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

我的代码:

<?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);
?>

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

4

2 回答 2

1

尽管鲍里斯拉夫的回答是针对您的问题的“症状”,但对 OP 遇到的两个 cURL 错误的简单回答是常量:

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

CURLOPT_HEADER.

所有 cURL 选项常量都以 CURLOPT-作为前缀。请参阅PHP 手册 - cURL 传输选项并向下滚动查看常量。

进一步解释错误线索:

第一个错误:

注意:使用未定义的常量 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

于 2015-09-24T05:36:52.560 回答
0

这:

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

意味着 PHP 不将 CURL_HEADER 识别为常量。也许你的版本是旧的?或者你打错了,或者它不存在。这:

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

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

HTTP 状态 405 .... 废话,废话

确切地说是:服务器返回HTTP 405 Method Not Allowed

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

所以如果你可以选择改变你的方法,我鼓励你现在改用 Guzzle。;)

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

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

然后:

composer.phar install

PEAR install 也是一个选项:

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

当然,您也可以只包含guzzle.phar.

查看Guzzle 文档以获取更多信息。

干杯!

于 2013-09-25T12:43:17.227 回答