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.
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:
<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.
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
| Status | Betydning |
|---|---|
200 | Virksomheden blev fundet. Svaret er JSON. |
404 | Der findes ingen virksomhed med det CVR-nummer. Body: {"detail": {"error": "NOT_FOUND"}} |
422 | CVR-nummeret er ikke et tal. |
502 | CVR-registret svarede ikke. Prøv igen om lidt. |
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.