2017-07-17 4 views
2

J'utilise HP-ALM 12.01 qui semble être pleine de problèmes. Je ne peux pas mettre à jour vers une autre version pour le moment. J'essaie d'avoir accès à l'API de repos pour télécharger automatiquement les résultats de test à partir de JUnit. J'utilise l'infrastructure affichée here (exemple d'application -> Infrastructure). À partir de là, mes scripts de connexion transmettent les informations de connexion encodées en base64 à authentification-point/authenticate et je récupère un cookie LWSSO valide. Cependant, lorsque j'utilise ce cookie pour me connecter à repos/session-site pour recevoir mes cookies QCSession, je reçois une erreur 411 Length Required. J'ai essayé de coder en dur la longueur de contenu dans les en-têtes comme montré iciHP ALM Rest API QCSession 411 Authentification

public void GetQCSession(){ 
    String qcsessionurl = con.buildUrl("rest/site-session"); 
    Map<String, String> requestHeaders = new HashMap<String, String>(); 
    requestHeaders.put("Content-Type", "application/xml"); 
    requestHeaders.put("Accept", "application/xml"); 
    requestHeaders.put("Content-Length", "0"); 
    try { 
     Response resp = con.httpPost(qcsessionurl, null, requestHeaders); 
     con.updateCookies(resp); 
     System.out.println(resp.getStatusCode()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Cela n'a pas fonctionné. J'ai aussi essayé de modifier l'infrastructure pour injecter automatiquement l'en-tête Content-Length, comme indiqué ici

private void prepareHttpRequest(
     HttpURLConnection con, 
     Map<String, String> headers, 
     byte[] bytes, 
     String cookieString) throws IOException { 

    String contentType = null; 

    //attach cookie information if such exists 
    if ((cookieString != null) && !cookieString.isEmpty()) { 

     con.setRequestProperty("Cookie", cookieString); 
    } 

    //send data from headers 
    if (headers != null) { 

     //Skip the content-type header - should only be sent 
     //if you actually have any content to send. see below. 
     contentType = headers.remove("Content-Type"); 

     Iterator<Entry<String, String>> 
       headersIterator = headers.entrySet().iterator(); 
     while (headersIterator.hasNext()) { 
      Entry<String, String> header = headersIterator.next(); 
      con.setRequestProperty(header.getKey(), header.getValue()); 
     } 
    } 

    // If there's data to attach to the request, it's handled here. 
    // Note that if data exists, we take into account previously removed 
    // content-type. 
    if ((bytes != null) && (bytes.length > 0)) { 

     con.setDoOutput(true); 

     //warning: if you add content-type header then you MUST send 
     // information or receive error. 
     //so only do so if you're writing information... 
     if (contentType != null) { 
      con.setRequestProperty("Content-Type", contentType); 
     } 

     OutputStream out = con.getOutputStream(); 
     out.write(bytes); 
     out.flush(); 
     out.close(); 
     con.setRequestProperty("Content-Length", Integer.toString(bytes.length)); 
    } else { 
     con.setRequestProperty("Content-Length", "0"); 
    } 
} 

qui ne fonctionne pas aussi. notez que setRequestProperty fait simplement un .set (clé, valeur) à MessageHeader

Est-ce que quelqu'un a déjà traité ce problème ou a résolu le problème?

Notez qu'aucun de ces problèmes ne se produit avec le facteur. Les 4 cookies sont générés après un post de session de site.

Répondre

1

Le problème est que HttpURLConnection de Java ignore certaines propriétés lorsqu'il est défini manuellement. L'un d'entre eux est Content-Length. C'est parce qu'il le définit automatiquement. Cependant, si vous n'envoyez aucune donnée, il ne l'envoie tout simplement pas, ce que ALM n'accepte pas en raison de ses protocoles HTTP obsolètes, car il s'attend à recevoir un contenu de 0.

Pour contourner ce problème dois dire java pour autoriser les en-têtes restreints. Cela se fait en exécutant

System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); 

pour plus d'informations, regardez ici Why does Content-Length HTTP header field use a value other than the one given in Java code?

+0

@Cyrusu vous n'avez pas besoin d'envoyer la longueur du contenu pour obtenir le cookie QCsession – Barney

0

pom.xml Dépendance

<dependency> 
    <groupId>org.glassfish.jersey.bundles</groupId> 
    <artifactId>jaxrs-ri</artifactId> 
    <version>2.0</version> 
</dependency> 

code Java: Connectez-vous, obtenir le premier défaut, Déconnexion

import java.util.Base64; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.Invocation; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.Cookie; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

public class App { 

    private static final String almURL = "https://abc.hp.com/qcbin"; 
    private static final String isAuthenticatedPath = "authentication-point/authenticate"; 
    private static final String qcSiteSession = "rest/site-session"; 
    private static final String logoutPath = "authentication-point/logout"; 
    private static String lswoocookie; 
    private static String qcsessioncookie; 

    public static String strDomain = "domain"; 
    public static String strProject = "project"; 
    public static String strUserName = "username"; 
    public static String strPassword = "password"; 

    public static Client client; 
    public static WebTarget target; 
    public static Invocation.Builder invocationBuilder; 
    public static Response res; 


    private static String getEncodedAuthString() { 
     String auth = strUserName + ":" + strPassword; 
     byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes()); 
     String authHeader = "Basic " + new String(encodedAuth); 

     return authHeader; 
    } 

    public static void main(String args[]){ 
     client = ClientBuilder.newBuilder().build(); 

     /* Get LWSSO Cookie */ 
     target = client.target(almURL).path(
       isAuthenticatedPath); 
     invocationBuilder = target.request(new String[] { "application/xml" }); 
     invocationBuilder.header("Authorization", getEncodedAuthString()); 
     res = invocationBuilder.get(); 
     lswoocookie = res.getCookies().get("LWSSO_COOKIE_KEY").getValue(); 

     /* Get QCSession Cookie */ 
     target = client.target(almURL).path(qcSiteSession); 
     invocationBuilder = target 
       .request(); 
     invocationBuilder.cookie("LWSSO_COOKIE_KEY", lswoocookie); 
     res = invocationBuilder.post(null); 
     qcsessioncookie = res.getCookies().get("QCSession").getValue(); 

     /* Get the first defect */ 
     String midPoint = "rest/domains/" + strDomain + "/projects/" + strProject; 
     target = client.target(almURL).path(midPoint).path("defects/1"); 
     invocationBuilder = target 
       .request(new String[] { "application/json" }); 
     invocationBuilder.cookie("LWSSO_COOKIE_KEY", lswoocookie); 
     invocationBuilder.cookie("QCSession", qcsessioncookie); 
     res = invocationBuilder.get(); 

     /* Logout */ 
     target = client.target(almURL).path(logoutPath); 
     invocationBuilder = target 
       .request(); 
     invocationBuilder.cookie("LWSSO_COOKIE_KEY", lswoocookie); 
     invocationBuilder.cookie("QCSession", qcsessioncookie); 
     res = invocationBuilder.post(null); 
    } 
}