1

我正在尝试使用REST APIthrough Curl&更新 ALM 中的测试数据PHP

Step 1 : Check Lock Status => GET method | response => UNLOCKED

Step 2 : Acquire Lock => POST method | response <entity data XML>

Step 3 : Check Lock Status => GET method | response LOCKED_BY_ME

Step 4 : Checkout Versions | Optional

Step 5 : Update data => PUT method | response = http_code = 200 OK

在第 3 步之前工作正常,跳过第 4 步。

我成功了,直到第 3 步,我得到的响应为LOCKED_BY_ME. 第 4 步我跳过了,因为我们没有版本控制概念。其中第 5 步,当我绑定发送 xml 数据时出现错误415 (Unsupported Media),我相信这是因为 ALM 服务器无法识别我发送的数据。我通过发送“<code>Associative array/XMl/JSON”来尝试它,但我得到的状态码是 415。

这是我的代码。

代码

$url="http://{Host:port}/qcbin/rest/domains/{domainname}/projects/{Projectname}/tests/{id}/lock";

function update_tests()
{

    $qc=$this->curl_auth();
    $headers = array("DELETE /HTTP/1.1","Content-Type:text/xml");
curl_setopt($qc, CURLOPT_TIMEOUT, $timeout);
curl_setopt($qc, CURLOPT_URL, $url);
    curl_setopt($qc, CURLOPT_RETURNTRANSFER, true);
curl_setopt($qc, CURLOPT_COOKIESESSION, true);
curl_setopt($qc, CURLOPT_COOKIEJAR,BASEPATH .'cookie.txt');
$res_unlock=curl_exec($qc);
    $resp=curl_getinfo($qc);

    $xml=simplexml_load_string(curl_exec($qc));

    if($xml->LockStatus == 'LOCKED_BY_OTHER' || $xml->LockStatus == 'LOCKED_BY_ME')
{
    $headers = array(
        'Accept: application/xml',
        'Content-Type: application/xml',
    );

    $data= <<<XML
<Entity Type="test">
<Fields>
<Field Name="Name">
<Value>Name of the test</Value> 
</Field>
<Field Name="Status">
<Value>Updated Value</Value>
</Field>
</Fields>
</Entity>
XML;

        curl_setopt($qc, CURLOPT_URL, $url);
        curl_setopt($qc, CURLOPT_HTTPHEADER, $header);
    curl_setopt($qc, CURLOPT_HEADER, 1);
    curl_setopt($qc, CURLOPT_PUT, 1);
    curl_setopt($qc, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($qc, CURLOPT_POSTFIELDS, $data);
    curl_setopt($qc, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($qc);
    $resp=curl_getinfo($qc);
}
else
{
        $data='';
        curl_setopt($qc, CURLOPT_URL, $url);

    curl_setopt($qc, CURLOPT_HEADER, true);
    curl_setopt($qc, CURLOPT_POST, 1);
    curl_setopt($qc, CURLOPT_POSTFIELDS, $data);
    $res_Lock=curl_exec($qc);
        $resp=curl_getinfo($qc);

        if($resp['http_code'] == 200)
        {
        $headers = array(
           'Accept: application/xml',
           'Content-Type: application/xml',
        );


        $file = BASEPATH."tests.xml";
        $data= <<<XML
<Entity Type="test">
<Fields>
<Field Name="Name">
<Value>Name of the test</Value> 
</Field>
<Field Name="Status">
<Value>Updated Value</Value> 
</Field>
</Fields>
</Entity>
XML;

           curl_setopt($qc, CURLOPT_URL, $url);
               curl_setopt($qc, CURLOPT_HTTPHEADER, $header);
           curl_setopt($qc, CURLOPT_HEADER, 1);
           curl_setopt($qc, CURLOPT_PUT, 1);
           curl_setopt($qc, CURLOPT_CUSTOMREQUEST, "PUT");
           curl_setopt($qc, CURLOPT_POSTFIELDS, $data);
           curl_setopt($qc, CURLOPT_RETURNTRANSFER, 1);
           $result = curl_exec($qc);
           $resp=curl_getinfo($qc);
        }
    }
}

我明白415 Error了,我无法使用PUT方法发送数据。感谢您的帮助。

谢谢

4

2 回答 2

0

您应该将 CURLOPT_INFILE 与 PUT 操作一起使用。POSTFIELDS 用于 POST 操作。

于 2014-05-06T18:23:02.863 回答
0

在上面,看起来您的 HTTP 标头位于变量 $headers 中,但您正在从 $header 设置 HTTP 标头的 curl 选项。

我今天一直在为 HP ALM 的类似问题而苦苦挣扎。当我 100% 确定正在设置以下标头时,一切都开始正常工作:

内容类型:application/xml 接受:application/xml

要使 HP ALM 界面正常工作,似乎需要做三件事:

  1. URL - 显然
  2. http 标头 - 几乎还不够好
  3. 有效载荷 - 从上面看

文档https://almelsevier.saas.hp.com/qcbin/Help/doc_library/api_refs/REST/webframe.html几乎可以接受。

于 2014-04-11T15:42:56.473 回答