Создание NewPageIterator для выполнения поискового запроса с использованием Microsoft Graph SDK для Go

Я получаю сообщение «Ошибка создания итератора страницы: свойство значения отсутствует в объекте ответа», используя Microsoft Graph SDK в Go и пытаясь создать NewPageIterator. Как я могу решить эту проблему?

Код работает, если я уберу часть нумерации страниц. Я пытаюсь заставить работать нумерацию страниц. Я также использую веб-фреймворк Echo, но мой вопрос конкретно в том, как создать правильный итератор страницы, который будет работать с поисковым запросом.

package handlers

import (
    "context"
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "os"

    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/labstack/echo/v4"
    msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go"
    msgraphcore "github.com/microsoftgraph/msgraph-sdk-go-core"
    "github.com/microsoftgraph/msgraph-sdk-go/models/security"
    graphsecurity "github.com/microsoftgraph/msgraph-sdk-go/security"
)

func getClientWithCredentials() (*msgraphsdk.GraphServiceClient, error) {

    tenantID := os.Getenv("AZURE_TENANT_ID")
    clientID := os.Getenv("AZURE_CLIENT_ID")
    clientSecret := os.Getenv("AZURE_CLIENT_SECRET")

    cred, err := azidentity.NewClientSecretCredential(tenantID, clientID, clientSecret, nil)

    if err != nil {
        fmt.Printf("Error creating credentials: %v\n", err)
    }

    client, err := msgraphsdk.NewGraphServiceClientWithCredentials(cred, nil)
    if err != nil {
        fmt.Printf("Error creating client: %v\n", err)
        return client, err
    }
    return client, nil
}

func RunKQL(c echo.Context) error {

    body, err := io.ReadAll(c.Request().Body)
    if err != nil {
        return err
    }
    query := string(body)

    timespan := c.QueryParam("timespan")

    client, err := getClientWithCredentials()
    if err != nil {
        c.Logger().Fatalf("Could not get access token: %v", err)
    }

    requestBody := graphsecurity.NewMicrosoftgraphsecurityrunhuntingqueryRunHuntingQueryPostRequestBody()
    requestBody.SetQuery(&query)
    if timespan != "" {
        requestBody.SetTimespan(&timespan)
    }
    result, err := client.Security().MicrosoftGraphSecurityRunHuntingQuery().Post(context.Background(), requestBody, nil)
    if err != nil {
        c.Logger().Fatalf("Error running hunting query: %v", err)
    }

    // Initialize iterator - this is not working to create a NewPageIterator
    pageIterator, err := msgraphcore.NewPageIterator[*security.HuntingQueryResultsable](
        result,
        client.GetAdapter(),
        security.CreateHuntingQueryResultsFromDiscriminatorValue)
    if err != nil {
        log.Fatalf("Error creating page iterator: %v\n", err)
    }

    //Iterate over all pages
    jsonObjects := make([]map[string]interface{}, 0)
    err2 := pageIterator.Iterate(
        context.Background(),
        func(pageItem *security.HuntingQueryResultsable) bool {
            // Process each page item here
            if results := (*pageItem).GetResults(); results != nil {
                for _, result := range results {
                    jsonData := result.GetAdditionalData()
                    jsonObjects = append(jsonObjects, jsonData)
                }
            }
            // Return true to continue iterating to the next page
            return true
        })
    if err2 != nil {
        log.Fatalf("Error iterating over security results: %v\n", err2)
    }

    //Working without using Page Iterator
    // jsonObjects := make([]map[string]interface{}, 0)
    // for _, result := range result.GetResults() {
    //  jsonData := result.GetAdditionalData()
    //  jsonObjects = append(jsonObjects, jsonData)
    // }

    jsonRes, err := json.MarshalIndent(jsonObjects, "", "  ")
    if err != nil {
        fmt.Println("Error marshalling JSON array:", err)
        return c.String(http.StatusInternalServerError, "Error generating JSON response")
    }

    return c.String(http.StatusOK, string(jsonRes))
}
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В качестве result вы получаете security.HuntingQueryResultsable , который не является коллекцией (например, security.AlertCollectionResponseable ), поэтому в нем отсутствует функция GetValue.

Вот что означает «свойство значения отсутствует в объекте ответа» — вы не можете перебирать результат, поскольку это не коллекция.

это имеет смысл, однако это не коллекция, которую можно использовать для итерации. Однако «результат» имеет тип «security.HuntingQueryResultsable», поэтому я не уверен, что использовать для NewPageIterator.

Rob Buhler 26.06.2024 21:22

Это результат. Вы не можете ничего перебирать, только коллекции.

eik 27.06.2024 13:06

Похоже, что у Hunting Query нет коллекции, а есть только результат.

Rob Buhler 27.06.2024 18:58

Результаты по-прежнему можно разбивать на страницы, ограничив результаты в запросе KQL или установив короткий промежуток времени. Это эффективные обходные пути. Первоначально я думал, что подход итератора сработает.

Rob Buhler 27.06.2024 19:36

Да, API несколько странный. Кроме того, отсутствует документация.

eik 27.06.2024 20:40

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