**Ohjelmointirajapinta** (engl. *application programming interface, API*) on komponenttien ja moduulien välinen raja ohjelmoitavassa järjestelmässä.

Ohjelmointirajapinta on määritelmä, jonka mukaan eri ohjelmat voivat tehdä pyyntöjä ja vaihtaa tietoja eli *keskustella* keskenään. Esimerkki rajapinnasta on käyttöjärjestelmän rajapinta, jolla ohjelmat voivat käyttää keskusmuistia sekä tiedostoja.

Ohjelmointirajapinnat voivat toimia ohjelmien välillä tai ohjelmien ja laitteiston välillä (esimerkiksi BIOS). Ohjelmointirajapinnan tunnusmerkkeihin kuuluvat *joukko toimintoja syötteiden ja tulosteiden määrittäminä* sekä *mahdollisuus muuttaa toteutusta ilman häiriötä sen käyttäjille*.

Ohjelmointirajapintoja voi toteuttaa lähes kaikilla olemassa olevilla ohjelmointikielillä. Termillä viitataan usein myös internetin yli toimiviin ohjelmointirajapintoihin (Web API). Internetin yli toimivien ohjelmointirajapintojen voidaan katsoa olevan esimerkiksi Amazonin AWS-pilvipalvelujen menestyksen taustalla. Niiden liiketoiminnallisena ideana on kapseloida palvelimien monimukainen logiikka helppokäyttöisen ohjelmointirajapinnan taakse ja tuottaa siitä ohjelmointirajapinnan avulla yksinkertainen tapa hyödyntää niitä tarpeen mukaan. Moderneja internetin yli toimivia ohjelmointirajapintoja toteutetaan esimerkiksi Restful-arkkitehtuurityylillä.

Historia
--------

Keskeisessä osassa ohjelmointirajapintojen syntyä on Maurice Wilkesin, David Wheelerin ja Stanley Gillin työ EDSAC-tietokoneen parissa. 
Aiempi John von Neumannin ja Herman Goldstinen työ käsitteli aihetta hyvin yleisellä tasolla.
Wilkesin havaittua ensimmäisen ei-triviaalin ohjelman yhteydessä käyttävänsä jatkossa huomattavasti aikaa ohjelmien debuggaukseen tunnistettiin tarve uudelleen käytettäville alirutiineille. EDSAC:lla ei ollut vielä kilpailevia arkkitehtuureita, ei edes toista samanlaista tietokonetta eikä ennestään ollut olemassa vanhoja tuettavia ohjelmia, mutta se oli varhainen käsitteen syntyyn vaikuttanut askel.
Ensimmäinen termin *application programming interface* käyttö liitetään vuoden 1968 artikkeliin *Data Structures and Techniques for Remote Computer Graphics*.

Kuvaus
------

Kirjastojen kanssa ohjelmointirajapinta määrittää, miten ohjelma kutsuu kirjastoa. Ohjelmistokehyksen kanssa ohjelmointirajapinta määrittää, miten kehys kutsuu ohjelmaa. Dokumentointi on keskeinen osa rajapintaa.

Yksi ohjelmointirajapinnan päätarkoituksista on tarjota käyttömahdollisuus yleisimmille toiminnoille. Käyttöliittymä voi esimerkiksi tarjota ohjelmointirajapinnan ikkunoiden tai kuvakkeiden piirtoon, ja tietokanta taas rajapinnan kyselyiden läpiviemiseksi. Ohjelmointirajapinta liitetään hyvin usein osaksi **SDK:ta** (*Software development kit*).

Hyvä ohjelmointirajapinta sisältää kapseloinnin, jonka avulla ohjelmoijan ei tarvitse tietää rajapinnan alaisista menetelmistä. Tämän avulla rajapinta voidaan pitää "alaspäin yhteensopivana", eli ohjelmointirajapinnan toimintaa voidaan tehostaa ilman, että ohjelma, joka käyttää rajapintaa, häiriintyisi siitä.

Ohjelmointirajapintojen julkaisukäytännöistä erottuu kolme erilaista tapaa:

1. *Ohjelmointirajapintaa ei julkaista* (yksityinen)
2. *Rajapinta julkaistaan tietyin rajoituksin* (yhteistyökumppanit)
3. *Täysin tai lähestulkoon avoin ohjelmointirajapinnan julkaisu* (julkinen)

POSIX on esimerkki standardoidusta rajapinnasta, jonka kuvaus on avoimesti saatavilla ja useiden valmistajien tukema.
Useiden pelikonsolien ohjelmointirajapinnat ovat saatavilla vain lisensoiduille tahoille.
Suljettuja rajapintoja on käytössä kaupallisissa ohjelmistoissa, joissa ne ovat vain kehittäjätahon tiedossa.

Käytännössä järjestelmä voi sisältää kaikkia kolmea, esimerkiksi kaupallisessa käyttöjärjestelmässä on vain kehittäjien tiedossa olevia rajapintoja, yhteistyökumppaneille avattuja rajapintoja sekä julkisia rajapintoja sovelluskehittäjille.

Kiistat
-------

Rajapinnat ovat keskeisessä osassa kiistaa Oraclen ja Googlen välillä jälkimmäisen Java-toteutukseen liittyen. Yhdysvaltain korkeimman oikeuden päätöksessä rajapintojen käyttö ei rikkonut tekijänoikeuslakia. Päätöksessä todettiin, että jos Oracle saisi rajoittaa rajapintojensa käyttöä se olisi haitallista ja rajoittaisi uusien ohjelmistojen kehittämistä. Vuonna 2021 ratkaistu kiista on ollut käynnissä vuodesta 2010 lähtien.

Suomen julkisen hallinnon API-periaatteet
-----------------------------------------

Suomessa on laadittu vuonna 2022 julkisen hallinnon API-periaatteet. Niiden tavoitteena yhtenäistää julkisen hallinnon eri organisaatioiden toimintaa ohjelmointirajapinnoissa. Lisäksi Digi- ja väestötietovirasto koordinoi julkisen hallinnon API-verkostoa, jossa ylläpidetään ja kehitetään julkisen hallinnon API-periaatteita.

Kansalaisjärjestötyö
--------------------

Open Knowledge Finland ry. on laatinut avoimen ohjelmointirajapinnan määritelmän vuonna 2014, jonka ideana on määritellä avoin ohjelmointirajapinta terminä.

Katso myös
----------

* ABI (*Application binary interface*)

Lähteet
-------

1. 1 2 3 4  Charlie Garrod & Jonathan Aldrich: Principles of Software Construction: Objects, Design, and Concurrency – Principles of API Design (PDF) *cs.cmu.edu*.  syksy 2014. Viitattu 17.6.2021. (englanniksi)
2. ↑  Joshua Bloch: A Brief, Opinionated History of the API *infoq.com*.  (englanniksi)
3. 1 2 3 4 5 6  Kristopher Sandoval: Who Invented the API? *nordicapis.com*.  20.9.2018. Viitattu 17.6.2021. (englanniksi)
4. ↑  Nordic APIs: The Bezos API Mandate: Amazon's Manifesto For Externalization | Nordic APIs | *Nordic APIs*.  19.1.2021. Viitattu 29.10.2023. (englanniksi)
5. ↑  Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST) *ics.uci.edu*. Viitattu 29.10.2023.
6. ↑  The Supreme Court hears Oracle v. Google tomorrow—here’s what’s at stake *arstechnica.com*.  7.10.2020. Viitattu 7.10.2020. (englanniksi)
7. 1 2 3  Andrew Chung: U.S. Supreme Court sides with Google in major copyright dispute with Oracle *reuters.com*.  5.4.2021. Viitattu 5.4.2021. (englanniksi)
8. ↑  Miina Arajärvi, Maaret Saukonoja, Pasi Vänttinen: Julkisen hallinnon API-periaatteet *julkaisut.valtioneuvosto.fi*.  28.2.2022. Viitattu 29.10.2023.
9. ↑  Verkostoyhteistyö | avoindata.fi *www.avoindata.fi*. Viitattu 29.10.2023.
10. ↑  avoinrajapinta.fi *avoinrajapinta.fi*. Viitattu 29.10.2023.

Aiheesta muualla
----------------

* A Brief, Opinionated History of the API (englanniksi)
* How to Design a Good API and Why it Matters (PDF) (englanniksi)
* How Do I Make This Hard to Misuse? (englanniksi)
* What If I Don't Actually Like My Users? (englanniksi)
* avoinrajapinta.fi: Avoimen rajapinnan määritelmä