Я получаю сообщение «Ошибка создания итератора страницы: свойство значения отсутствует в объекте ответа», используя 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(×pan)
}
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))
}
В качестве result
вы получаете security.HuntingQueryResultsable , который не является коллекцией (например, security.AlertCollectionResponseable ), поэтому в нем отсутствует функция GetValue
.
Вот что означает «свойство значения отсутствует в объекте ответа» — вы не можете перебирать результат, поскольку это не коллекция.
Это результат. Вы не можете ничего перебирать, только коллекции.
Похоже, что у Hunting Query нет коллекции, а есть только результат.
Результаты по-прежнему можно разбивать на страницы, ограничив результаты в запросе KQL или установив короткий промежуток времени. Это эффективные обходные пути. Первоначально я думал, что подход итератора сработает.
Да, API несколько странный. Кроме того, отсутствует документация.
это имеет смысл, однако это не коллекция, которую можно использовать для итерации. Однако «результат» имеет тип «security.HuntingQueryResultsable», поэтому я не уверен, что использовать для NewPageIterator.