Avatar billede krukken Mester
18. november 2025 - 10:57 Der er 11 kommentarer og
2 løsninger

Hent Virksomhed hos graphql.datafordeler.dk

Jeg sidder og kæmper med at hente en virksomhed hos graphql.datafordeler.dk. Jeg har en gyldig Apikey, men jeg kan ikke få noget meningsfyldt retur - programmet afslutter bare, når jeg laver mit request.

Her er min kode:
        public CvrGraphQlClient(string apiKey)
        {
            // HttpClient uden certifikat
            var http = new HttpClient();
            //http.DefaultRequestHeaders.Add("Authorization", $"Apikey {apiKey}");

            _client = new GraphQLHttpClient(
                new GraphQLHttpClientOptions
                {
                    EndPoint = new Uri($"https://graphql.datafordeler.dk/CVR/v1?apiKey={apiKey}")
                },
                new NewtonsoftJsonSerializer(),
                http);
        }

        public async Task<BeskaeftigelseNode> HentSenesteBeskæftigelseAsync(string cvr)
        {
            // 1️⃣ Hent CVREnhedsId
            var queryEnhed = @"query {
  virksomheder(filter:  { cvrNummer: { eq: $cvr } }) {
    navn
    adresse {
      gade
      postnummer
      kommunenavn
    }
    branche {
      kode
      tekst
    }
    telefonnummer {
      nummer
      type
    }
  }
}";
            var requestEnhed = new GraphQLRequest
            {
                Query = queryEnhed,
                Variables = new { cvr }
            };

            var responseEnhed = await _client.SendQueryAsync<CVREnhedResponse>(requestEnhed);
            var enhedNode = responseEnhed.Data?.Data.CVREnhed?.Nodes?.FirstOrDefault();
        }
    }

Er der nogen, som kan hjælpe mig med at få et kørende eksempel?
Avatar billede krukken Mester
18. november 2025 - 11:16 #1
Dette mener jeg burde virke:
    public CvrGraphQlClient(string apiKey)
    {
        var http = new HttpClient();
        _client = new GraphQLHttpClient(
            new GraphQLHttpClientOptions
            {
                EndPoint = new Uri($"https://graphql.datafordeler.dk/CVR/v1?apiKey={apiKey}")
            },
            new NewtonsoftJsonSerializer(),
            http);
    }

    public async Task<CvrVirksomhedResponse> HentSenesteBeskæftigelseAsync(string cvr)
    {
        // 1️⃣ Hent CVREnhedsId
        var queryEnhed = @"query {
                          virksomheder(filter:  { cvrNummer: { eq: $cvr } }) {
                            navn
                            adresse {
                              gade
                              postnummer
                              kommunenavn
                            }
                            branche {
                              kode
                              tekst
                            }
                            telefonnummer {
                              nummer
                              type
                            }
                          }
                        }";
        var requestEnhed = new GraphQLRequest
        {
            Query = queryEnhed,
            Variables = new { cvr },
           

        };

        GraphQLResponse<CvrVirksomhedResponse> response = await _client.SendQueryAsync<CvrVirksomhedResponse>(requestEnhed);

        CvrVirksomhedResponse data = response.Data; // <-- her får du selve data

        return data;
    }
}

Men programmet stopper bare uden fejl eller exceptions her: GraphQLResponse<CvrVirksomhedResponse> response = await _client.SendQueryAsync<CvrVirksomhedResponse>(requestEnhed);
Avatar billede chrisrj Forsker
18. november 2025 - 12:20 #2
Bed din AI om at tilføje debug logs og errorhandling...
Avatar billede krukken Mester
18. november 2025 - 12:58 #3
Tak for input - jeg har selvfølgelig prøvet ALT igennem AI, og lige meget har det hjulpet :(
Avatar billede chrisrj Forsker
18. november 2025 - 13:38 #4
Nej, det har du ikke.
Jeg bruger selv CGPT på jobbet. Den kan sagtens gøre de ting.
Avatar billede krukken Mester
18. november 2025 - 13:57 #5
Tak for dit input. Jeg har prøvet fange exceptions og prøvet at udskrive fejl. Der kommer ingen exceptions eller fejl.

Programmet stopper inden exceptions og fejl ved følgende linje: GraphQLResponse<CvrVirksomhedResponse> response = await _client.SendQueryAsync<CvrVirksomhedResponse>(requestEnhed);

Der sker ikke mere. Følgende er linjen i output vinduet: The program '[10064] CVROpslag.exe' has exited with code 0 (0x0).
Avatar billede krukken Mester
18. november 2025 - 14:02 #6
Du må da gerne se at det er tilføjet - men det ændrer ikke nogt:
    public async Task<string> HentSenesteBeskæftigelseAsync(string cvr)
    {
        // 1️⃣ Hent CVREnhedsId
        var query = @"
        query HentEnhed($cvr: String!) {
          CVREnhed(where: { cvrNummer: { eq: $cvr } }) {
            nodes {
              cvrNummer
              navn
              email
              antalMedarbejdere
              adresse {
                vejnavn
                husnummer
                postnummer
                postdistrikt
              }
            }
          }
        }";


        var request = new GraphQLRequest
        {
            Query = query,
            Variables = new { cvr = cvr }
        };

        GraphQLResponse<CVREnhedResponse> response = null;

        try
        {
            Debug.WriteLine("DEBUG: Sender GraphQL-forespørgsel...");
            response = await _client.SendQueryAsync<CVREnhedResponse>(request);
            Debug.WriteLine("DEBUG: Forespørgsel sendt. Response modtaget.");
            Debug.WriteLine("DEBUG: Response data: " + response);
        }
        catch (OperationCanceledException)
        {
            Debug.WriteLine("ERROR: Forespørgslen blev annulleret (cancellation token).");
        }
        catch (HttpRequestException httpEx)
        {
            Debug.WriteLine("ERROR: HTTP-fejl under GraphQL-kald: " + httpEx.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("ERROR: Uventet fejl under GraphQL-kald: " + ex.Message);
        }

        if (response.Errors != null && response.Errors.Length > 0)
        {
            Console.WriteLine("GraphQL errors:");
            foreach (var error in response.Errors)
                Console.WriteLine(error.Message);
        }



        return "";
    }
}

Der bliver ikke fanget nogen fejl - og der komme ingen fejl - den stopper bare programmet uden varsel i følgende linje: response = await _client.SendQueryAsync<CVREnhedResponse>(request);
Avatar billede arne_v Ekspert
18. november 2025 - 14:23 #7
Hvad med at skifte fra async til sync?

Det vil måske gøre det lidt nemmere at følge flowet.
Avatar billede chrisrj Forsker
18. november 2025 - 14:55 #8
Prøv evt. at udskrive dine inputs, de er muligvis ikke hvad du tror.
Avatar billede krukken Mester
19. november 2025 - 09:24 #9
Så vidt jeg lige kan læse mig frem til,  så kan man ikke lave en synkron model af CvrGraphQlClient :(
Avatar billede krukken Mester
19. november 2025 - 09:38 #10
Er det muligt at få en af jer eksperter til at prøve at køre følgende kode:
using GraphQL;
using GraphQL.Client.Http;
using GraphQL.Client.Serializer.Newtonsoft;
using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace CvrGraphQLDemo
{
    // ---------- MODELS ----------

    public class CVREnhedResponse
    {
        public CVREnhedContainer CVREnhed { get; set; }
    }

    public class CVREnhedContainer
    {
        public List<CVREnhedNode> nodes { get; set; }
    }

    public class CVREnhedNode
    {
        public string cvrNummer { get; set; }
        public string navn { get; set; }
        public string email { get; set; }
        public int? antalMedarbejdere { get; set; }
        public Adresse adresse { get; set; }
    }

    public class Adresse
    {
        public string vejnavn { get; set; }
        public string husnummer { get; set; }
        public string postnummer { get; set; }
        public string postdistrikt { get; set; }
    }


    // ---------- CLIENT ----------
    public class CvrGraphQlClient
    {
        private readonly GraphQLHttpClient _client;
        private const string QueryHentEnhed = @"
query HentEnhed($cvr: String!) {
  CVREnhed(where: { cvrNummer: { eq: $cvr } }) {
    nodes {
      cvrNummer
      navn
      email
      antalMedarbejdere
      adresse {
        vejnavn
        husnummer
        postnummer
        postdistrikt
      }
    }
  }
}";

        public CvrGraphQlClient(string apiKey)
        {
            var http = new HttpClient
            {
                Timeout = TimeSpan.FromSeconds(30)
            };

            // Datafordeler kræver API-key som query parameter – korrekt
            _client = new GraphQLHttpClient(
                new GraphQLHttpClientOptions
                {
                    EndPoint = new Uri($"https://graphql.datafordeler.dk/CVR/v1?apiKey={apiKey}")
                },
                new NewtonsoftJsonSerializer(),
                http
            );
        }

        public async Task<CVREnhedResponse> HentEnhedAsync(string cvr)
        {
           
       
        var request = new GraphQLRequest
            {
                Query = QueryHentEnhed,
                Variables = new { cvr = cvr }
            };

            try
            {
                Debug.WriteLine($"DEBUG: Sender forespørgsel mod Datafordeler for CVR={cvr}");

                var response = await _client.SendQueryAsync<CVREnhedResponse>(request);

                // GraphQL-fejl (fx invalid query)
                if (response.Errors != null && response.Errors.Length > 0)
                {
                    foreach (var err in response.Errors)
                    {
                        Debug.WriteLine("GRAPHQL ERROR: " + err.Message);
                    }

                    throw new Exception("GraphQL fejl modtaget fra Datafordeler.");
                }

                Debug.WriteLine("DEBUG: Response OK");
                Debug.WriteLine("DEBUG: Data: " +
                    JsonConvert.SerializeObject(response.Data, Formatting.Indented));

                return response.Data;
            }
            catch (GraphQLHttpRequestException ex)
            {
                Debug.WriteLine("HTTP FEJL i GraphQL kald: " + ex.Message);
                throw;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Uventet fejl i GraphQL kald: " + ex.Message);
                throw;
            }
        }
    }


        // ---------- PROGRAM ----------
        class Program
    {
        static async Task Main()
        {
            // 🔑 SKIFT TIL DIN API KEY
            var client = new CvrGraphQlClient("APIKEY");

            var result = client.HentEnhedAsync("12345678");
        }
    }
}

APIKEY er erstattet med "APIKEY", men ellers er det et kørende eksempel. Men jeg kunne godt tænke mig at finde ud af, om I også oplever at programmet bare terminere uden fejl og exception ved følgende linje: var response = await _client.SendQueryAsync<CVREnhedResponse>(request);

Jeg håber, at en har tid og lyst til at hjælpe mig :)
Avatar billede krukken Mester
19. november 2025 - 13:11 #11
Ahhh - gennembrud :)  "var result = await client.HentEnhedAsync("12345678");" - await betød, at programmet ikke bare blev afbrudt, og jeg kunne derefter debugge mig videre igennem de fejl, som bliver returneret på servicen :)
Avatar billede arne_v Ekspert
20. november 2025 - 03:23 #12
async/await kan godt være lidt tricky.

Her kommer en halvlang forklaring.

Først helt traditionel sync kode.

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Asy0
{
    public class Program
    {
        private static void Status(string note)
        {
            Console.WriteLine("Thread {0} - {1} : {2}", Thread.CurrentThread.ManagedThreadId,  DateTime.Now.ToString("HH:mm:ss,fff"), note);
        }
        private static void Test()
        {
            Status("Test start");
            Thread.Sleep(5000);
            Status("Test finish");
        }
        public static void Main(string[] args)
        {
            Status("Main start");
            Test();
            Status("Main finish");
            Console.ReadKey();
        }
    }
}


Output:

Thread 1 - 21:15:05,488 : Main start
Thread 1 - 21:15:05,588 : Test start
Thread 1 - 21:15:10,609 : Test finish
Thread 1 - 21:15:10,609 : Main finish


Ingen overraskelser i det.

Så en void async await variant.

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Asy1
{
    public class Program
    {
        private static void Status(string note)
        {
            Console.WriteLine("Thread {0} - {1} : {2}", Thread.CurrentThread.ManagedThreadId,  DateTime.Now.ToString("HH:mm:ss,fff"), note);
        }
        private async static void Test()
        {
            Status("Test start");
            await Task.Delay(5000);
            Status("Test finish");
        }
        public static void Main(string[] args)
        {
            Status("Main start");
            Test();
            Status("Main finish");
            Console.ReadKey();
        }
    }
}


Output:

Thread 1 - 21:16:40,200 : Main start
Thread 1 - 21:16:40,316 : Test start
Thread 1 - 21:16:40,385 : Main finish
Thread 4 - 21:16:45,387 : Test finish


Test metoden returnerer ved await og Main kører videre - resten af Test metoden
udføres i en anden tråd når den ventende operation er færdig.

Main ved ikke hvornår Test kører færdig.

Hvis Main skal vide det, så skal Test metoden returnere et Task objekt.

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Asy1
{
    public class Program
    {
        private static void Status(string note)
        {
            Console.WriteLine("Thread {0} - {1} : {2}", Thread.CurrentThread.ManagedThreadId,  DateTime.Now.ToString("HH:mm:ss,fff"), note);
        }
        private async static Task Test()
        {
            Status("Test start");
            await Task.Delay(5000);
            Status("Test finish");
        }
        public static void Main(string[] args)
        {
            Status("Main start");
            Task t = Test();
            Status("Main in between");
            t.Wait();
            Status("Main finish");
            Console.ReadKey();
        }
    }
}


Output:

Thread 1 - 21:19:19,456 : Main start
Thread 1 - 21:19:19,557 : Test start
Thread 1 - 21:19:19,625 : Main in between
Thread 4 - 21:19:24,630 : Test finish
Thread 1 - 21:19:24,630 : Main finish


Nu kan Main vente på at Test er kørt færdig, når Main får lyst til det. Det
giver mere kontrol over eksekveringen (men det er ikek altid der er brug for
sådan en kontrol).

Hvis man vil køre det sync, så sletter man await og appender en .Wait() til
det ventende kald.

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Asy1
{
    public class Program
    {
        private static void Status(string note)
        {
            Console.WriteLine("Thread {0} - {1} : {2}", Thread.CurrentThread.ManagedThreadId,  DateTime.Now.ToString("HH:mm:ss,fff"), note);
        }
        private async static Task Test()
        {
            Status("Test start");
            Task.Delay(5000).Wait();
            Status("Test finish");
        }
        public static void Main(string[] args)
        {
            Status("Main start");
            Task t = Test();
            Status("Main finish");
            Console.ReadKey();
        }
    }
}


(der kommer muligvis en warning om at den asyncøe metode ikke laver en awauít, men ...=

Output:

Thread 1 - 21:22:26,230 : Main start
Thread 1 - 21:22:26,351 : Test start
Thread 1 - 21:22:31,425 : Test finish
Thread 1 - 21:22:31,441 : Main finish
Avatar billede krukken Mester
20. november 2025 - 08:59 #13
Tusind tak for hjælpen :) Så er der hul igennem :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester