JIRA使用REST,PHP和cURL更新自定义字段

时间:2012-07-29 19:45:38

标签: php rest curl jira

我正在尝试使用REST API和PHP / cURL更新一些自定义字段。

我想知道我是否可能在没有意识到的情况下编辑了一些内容,而我昨天在“工作”之后的内容(我认为),它现在不起作用。

我使用不同的“方法”得到不同的回答,来自:

  1. 我使用POST方法得到这个,因为它在下面没有注释。

      

    HTTP 405 - 不允许指定的HTTP方法用于请求   resource()。

  2. 如果我使用已注释掉的PUT方法,并且POST已注释掉,我会得到这个。

    {"status-code":500,"message":"Read timed out"}
    
  3. 这一个混合和匹配PUT和POST。

    {"errorMessages":["No content to map to Object due to end of input"]}
    
  4. 我错过了什么/做错了什么?我使用以下代码:

    <?php
    
    $username = 'username';
    $password = 'password';
    
    $url = "https://example.com/rest/api/2/issue/PROJ-827";
    $ch = curl_init();
    
    $headers = array(
        'Accept: application/json',
        'Content-Type: application/json'
    );
    
    $test = "This is the content of the custom field.";
    
    $data = <<<JSON
    {
        "fields": {
            "customfield_11334" : ["$test"]
        }
    }
    JSON;
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    // Also tried, with the above two lines commented out...
    // curl_setopt($ch, CURLOPT_PUT, 1);
    // curl_setopt($ch, CURLOPT_INFILE, $data);
    // curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data));
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    
    $result = curl_exec($ch);
    $ch_error = curl_error($ch);
    
    if ($ch_error) {
        echo "cURL Error: $ch_error";
    } else {
        echo $result;
    }
    
    curl_close($ch);
    
    ?> 
    

1 个答案:

答案 0 :(得分:8)

这里的问题是PHP的cURL API不是特别直观。

您可能认为这是因为使用以下选项发送了POST请求正文 PUT请求将以相同的方式完成:

// works for sending a POST request
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// DOES NOT work to send a PUT request
curl_setopt($ch, CURLOPT_PUT, 1);
curl_setopt($ch, CURLOPT_PUTFIELDS, $data);

相反,要发送PUT请求(包含关联的正文数据),您需要以下内容:

// The correct way to send a PUT request
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

请注意,即使您发送了PUT请求,仍然必须使用CURLOPT_POSTFIELDS 发送PUT请求正文的选项。这是一个令人困惑和不一致的过程,但这就是你所做的 如果你想使用PHP cURL绑定,那就得到了。

根据relevant manual entrydocsCURLOPT_PUT选项似乎只适用于直接输入文件:

  

对于HTTP PUT文件为TRUE。必须使用CURLOPT_INFILE和CURLOPT_INFILESIZE设置PUT文件。

更好的选择IMHO是使用自定义流包装器进行HTTP客户端操作。这载有 不使您的应用程序依赖于底层libcurl库的好处。这样的 但是,实现超出了这个问题的范围。如果您有兴趣,Google就是您的朋友 开发流包装解决方案。