HP ALM REST API login using PHP CURL

前端 未结 3 2149
情歌与酒
情歌与酒 2020-12-17 04:35

I\'m new to REST and I\'m trying to develop a web app that will connect with JIRA from one sid (already covered) and with HP\'s ALM from the other side.

what I\'m at

3条回答
  •  心在旅途
    2020-12-17 05:15

    Here is my solution in Perl for this problem: The authentication step is performed first, setting the cookie for the next libcurl request which then can be performed with no problems. This is a version for background jobs. For a dialog application, the credentials could be passed through from the user's input instead. Also, I had to do this with https instead of http. The Perl program also shows how to instruct curl for https (there is a very good how-to on http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/ ).

    #!/usr/bin/perl 
    
    # This script accesses, as a proxy, the REST API of the HP quality center
    # Running it without query parameter, the complete list of defects is returned
    # A query parameter, e.g. 'query={id[2283]}' will be passed as is to the HP QC API
    
    # We are using the libcurl wrapper WWW::Curl::Easy
    # The access is https, so a certificate has to be passed to libcurl
    # The main point for using curl, however, is the authentication procedure:
    # HP requires a preparative call to a special authentication service
    # The authentication ticket will then be passed back as a cookie
    # Only with this ticket, the real GET request on the defects can be performed
    
    use WWW::Curl::Easy;
    
    use strict;
    use warnings;
    
    use constant {
      URL_QC_DEFECTS   => "https://[QC DOMAIN]/qcbin/rest/domains/[DOMAIN]/projects/[PROJECT]/defects/",
      URL_QC_AUTH      => "https://[QC DOMAIN]/qcbin/authentication-point/authenticate",
      PATH_CERT        => "[PATH TO CREDENTIALS]"  # contains certificate and credentials, see below
      };
    
    doRequest( URL_QC_DEFECTS . "?" . $ENV{QUERY_STRING} );
    return 0;
    
    sub doRequest {
      my ($url,$cookies,$response) = (shift,"","");
      eval {
        my $curl = get_curl_instance(\$cookies,\$response);
        authenticate( $curl );
        get( $curl, $url );
        if ($response =~ /.*?(<\?xml\b.*)/s) {
          print "Content-Type:text/xml\n\n";
          print $1;
          }
        else {
          die "The response from HP QC is not in XML format";
          }
        };
      if ($@) {
        print "Content-Type:text/plain\n\n$@";
        }
      }
    
    sub get_curl_instance {
    
      my ($cookie,$response) = @_;
    
      my $curl = WWW::Curl::Easy->new( );  
    
      open( my $cookiefile, ">", $cookie) or die "$!";
      $curl->setopt( CURLOPT_COOKIEFILE, $cookiefile );  
      open( my $responsefile, ">", $response) or die "$!";  
      $curl->setopt( CURLOPT_WRITEDATA, $responsefile );  
      $curl->setopt( CURLOPT_SSL_VERIFYPEER, 1);
      $curl->setopt( CURLOPT_SSL_VERIFYHOST, 2);
      $curl->setopt( CURLOPT_CAINFO, cert() );  
      $curl->setopt( CURLOPT_FOLLOWLOCATION, 1 );
      return $curl;
      }
    
    sub authenticate {
      my $curl = shift;
      my ($rc,$status);
      $curl->setopt( CURLOPT_URL, URL_QC_AUTH );
      $curl->setopt( CURLOPT_USERPWD, cred( ) );  
      if (($rc = $curl->perform( )) != 0) {
        die "Error Code $rc in curl->perform( ) on URL " . URL_QC_AUTH;
        }
      if (($status=$curl->getinfo(CURLINFO_HTTP_CODE))!="200") {
        die "HTTP-Statuscode $status from authentication call";
        }   
      }
    
    
    sub  get {
      my ($curl,$url) = @_;
      my ($rc,$status);
      $curl->setopt( CURLOPT_URL, $url );
      $curl->setopt( CURLOPT_HEADER, { Accept => "text/xml" } );
      if (($rc = $curl->perform( )) != 0) {
        die "Error Code $rc from defects request";
        }
      if (($status=$curl->getinfo(CURLINFO_HTTP_CODE))!="200") {
        die "HTTP Statuscode $status from defects request";
        }   
      }
    
    sub cred {
      open CRED, PATH_CERT . '/.cred_qc' or die "Can't open credentials file: $!";
      chomp( my $cred = ); 
      close CRED;
      return $cred;
      }
    
    sub cert {
      return PATH_CERT . '/qc.migros.net.crt';
      }  
    

提交回复
热议问题