CVR-opslag i Ruby og Rails

Ruby har både HTTP og JSON i standardbiblioteket, så et CVR-opslag fylder kun et par linjer. Du behøver hverken gems eller API-nøgle.

Slå en virksomhed op på CVR-nummer

ruby
require "net/http"
require "json"

def get_company(cvr)
  uri = URI("https://apicvr.dk/api/v1/#{cvr}")
  res = Net::HTTP.get_response(uri)

  case res
  when Net::HTTPOK       then JSON.parse(res.body)
  when Net::HTTPNotFound then nil
  else raise "CVR-API svarede #{res.code}" # 422 eller 502
  end
end

company = get_company(24256790)
puts "#{company["name"]}, #{company["zipcode"]} #{company["city"]}"

company["ejere"].each do |owner|
  puts "#{owner["name"]} #{owner["ownership_range"]}"
end

Søg på virksomhedsnavn

Fuzzy-søgningen finder virksomheder, selv om navnet er stavet lidt forkert. Hvert hit har name, cvr_number, industrycode og industrytext.

ruby
require "net/http"
require "json"
require "erb"

def search(name)
  uri = URI("https://apicvr.dk/api/v1/search/fuzzy/#{ERB::Util.url_encode(name)}")
  JSON.parse(Net::HTTP.get(uri))
end

search("novo nordisk").first(5).each do |hit|
  puts "#{hit["cvr_number"]} #{hit["name"]} - #{hit["industrytext"]}"
end

I en Rails-app

Firmadata ændrer sig sjældent. Læg opslaget i en service, og cache svaret, så samme CVR-nummer ikke slås op ved hver request:

ruby
# app/services/cvr_lookup.rb
class CvrLookup
  def self.call(cvr)
    Rails.cache.fetch("cvr/#{cvr}", expires_in: 6.hours) do
      res = Net::HTTP.get_response(URI("https://apicvr.dk/api/v1/#{cvr}"))
      res.is_a?(Net::HTTPOK) ? JSON.parse(res.body) : nil
    end
  end
end

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

Kan jeg bruge Faraday eller HTTParty?

Ja. API'et er et almindeligt GET-kald, der returnerer JSON, så enhver HTTP-klient virker. Eksemplerne bruger Net::HTTP, fordi det ikke kræver nogen gems.

Skal jeg bruge en API-nøgle?

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