CVR-opslag i Java

Fra Java 11 og frem har du en HTTP-klient i standardbiblioteket, så et CVR-opslag kræver kun ét kald og en JSON-parser. Du behøver ingen API-nøgle.

Slå en virksomhed op på CVR-nummer

Eksemplet bruger java.net.http.HttpClient og records fra Java 16+. Jackson mapper JSON-svaret til records'ene og ignorerer de felter, du ikke har taget med.

java
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.List;

public class Cvr {
    record Owner(String name, String ownership_range) {}
    record Company(int vat, String name, Integer zipcode, String city,
                   String industrydesc, List<Owner> ejere) {}

    static final HttpClient HTTP = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(10)).build();
    static final ObjectMapper JSON = new ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    static Company getCompany(int cvr) throws Exception {
        HttpRequest req = HttpRequest.newBuilder(URI.create("https://apicvr.dk/api/v1/" + cvr)).GET().build();
        HttpResponse<String> res = HTTP.send(req, HttpResponse.BodyHandlers.ofString());
        if (res.statusCode() == 404) return null;
        if (res.statusCode() != 200) throw new RuntimeException("CVR-API svarede " + res.statusCode());
        return JSON.readValue(res.body(), Company.class);
    }

    public static void main(String[] args) throws Exception {
        Company c = getCompany(24256790);
        System.out.println(c.name() + ", " + c.zipcode() + " " + c.city());
        for (Owner o : c.ejere()) System.out.println(o.name() + " " + o.ownership_range());
    }
}

Bemærk: protected er et reserveret ord i Java. Vil du læse feltet, så annotér komponenten med @JsonProperty("protected").

Tilføj Jackson

Java har ingen indbygget JSON-parser. Jackson er det mest udbredte valg. Med Maven:

xml
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.17.2</version>
</dependency>

Søg på virksomhedsnavn

Fuzzy-søgningen returnerer et slankt svar med name, cvr_number, industrycode og industrytext, også når navnet er stavet lidt forkert.

java
import com.fasterxml.jackson.core.type.TypeReference;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

record Hit(String name, Integer cvr_number, String industrytext) {}

static List<Hit> search(String name) throws Exception {
    String q = URLEncoder.encode(name, StandardCharsets.UTF_8).replace("+", "%20");
    HttpRequest req = HttpRequest.newBuilder(URI.create("https://apicvr.dk/api/v1/search/fuzzy/" + q)).build();
    String body = HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
    return JSON.readValue(body, new TypeReference<List<Hit>>() {});
}

// search("novo nordisk").stream().limit(5)
//     .forEach(h -> System.out.println(h.cvr_number() + " " + h.name()));

Håndter fejl

StatusBetydning
200Virksomheden blev fundet. Svaret er JSON.
404Der findes ingen virksomhed med det CVR-nummer. Body: {"detail": {"error": "NOT_FOUND"}}
422CVR-nummeret er ikke et tal.
502CVR-registret svarede ikke. Prøv igen om lidt.
Tjek altid protected, før du bruger data til markedsføring. Er feltet true, har virksomheden frabedt sig reklamehenvendelser.

Ofte stillede spørgsmål

Virker det i Spring Boot?

Ja. Du kan bruge RestClient eller WebClient i stedet for HttpClient. Spring Boot har allerede Jackson med, så du skal kun definere dine records.

Hvilken Java-version kræves?

HttpClient kræver Java 11. Records kræver Java 16. På ældre versioner kan du bruge almindelige klasser med getters i stedet.

Skal jeg bruge en API-nøgle?

Nej. CVR-API kræver hverken nøgle eller konto.