В Rally api v2.0 я не могу получить доступ к списку рабочих областей при запросе объекта подписки

Вот код, который я использую, чтобы запросить "подписку", а затем вернуть ссылку на рабочую область, к которой я хочу получить доступ:

public static String query_for_workspace(String ws, RallyRestApi r) throws IOException{

    String Wspace_ref=null;
    //Read Subscription
    QueryRequest subscriptionRequest = new QueryRequest("Subscriptions");
    subscriptionRequest.setFetch(new Fetch("Name", "Workspaces"));

    QueryResponse subscriptionQueryResponse = r.query(subscriptionRequest);
    String subName = subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Name").toString();
    System.out.println("Read Subscription: " + subName);

    // Grab Workspaces Collection
    JsonArray myWorkspaces = subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Workspaces").getAsJsonArray();

    // iterates through all workspaces and fetch 'ref' (string attribute) of the useful workspace
    for (int i=0; i<myWorkspaces.size(); i++) {
        JsonObject workspaceObject = myWorkspaces.get(i).getAsJsonObject();
        String workspaceRef = workspaceObject.get("_ref").getAsString();                
        GetRequest workspaceRequest = new GetRequest(workspaceRef);
        workspaceRequest.setFetch(new Fetch("Name"));
        GetResponse workspaceResponse = r.get(workspaceRequest);
        JsonObject workspaceObj = workspaceResponse.getObject();
        String workspaceName = workspaceObj.get("Name").getAsString();
        if(workspaceName.equals(ws)){
            System.out.printf("Workspace found ==> %s\n", workspaceName);
            Wspace_ref=workspaceRef;
        }
    }
    return Wspace_ref;
}

Ошибка исходит из этой строки:

JsonArray myWorkspaces=subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Workspaces").getAsJsonArray();

Этот код работает с 1.x API. Как получить доступ к списку рабочих пространств в 2.x?

Спасибо!

1 ответ

Решение

В Rally api v2.0 возможность возврата дочерних коллекций в одном ответе была удалена из соображений производительности. В версии 2.0 выборка коллекции возвратит объект с количеством и URL-адресом, из которого можно получить данные коллекции.

В более старых версиях WS API определенные списки выборок создавали много рекурсивных вызовов, и все коллекции, включенные в выборку, делают вызов довольно дорогим. В WS API v2.0 этого не произойдет, поскольку для получения объектов коллекций необходимо будет выполнить отдельный вызов.

Так что, я полагаю, в этой ситуации, если вы обновите свой код до:

public static String query_for_workspace(String ws, RallyRestApi r) throws IOException{

    String Wspace_ref=null;
    //Read Subscription
    QueryRequest subscriptionRequest = new QueryRequest("Subscriptions");

    QueryResponse subscriptionQueryResponse = r.query(subscriptionRequest);
    String subName = subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Name").toString();
    System.out.println("Read Subscription: " + subName);

    //Grab Workspaces Collection
    QueryRequest workspaceRequest = new QueryRequest(subscriptionQueryResponse.getResults().get(0).getAsJsonObject().getAsJsonObject("Workspaces"));
    workspaceRequest.setFetch(new Fetch("Name", "_ref”));

    JsonArray myWorkspaces = r.query(workspaceRequest).getResults();

    //Iterate through the Workspaces to find the correct one
    String workspaceName = "";

    for (int i=0; i<myWorkspaces.size(); i++){
        workspaceName = myWorkspaces.get(i).getAsJsonObject().get("Name").getAsString();
        if(workspaceName.equals(ws)){
            System.out.printf("Workspace found ==> %s\n", workspaceName);
            Wspace_ref = myWorkspaces.get(i).getAsJsonObject().get("_ref").getAsString();
        }
    }
    return Wspace_ref;
}

Это должно обеспечить Ref вам нужно.

Другие вопросы по тегам