# Was ist eine API



## BlubBlub (13. Jan 2010)

hi, ich wollt mal fragen was genau eine API ist. also auf wikipedia steht, dass es eine programmierschnitstelle ist, aber wie muss ich mir das genau vorstellen?
es gibt ja zum beispiel eine java API. und wenn ich mir internet die seite Java Platform SE 6 anschaue dann ist da eine java api spezifikation. eine spezifikation ist eine erläuterung zu einem produkt , einer software o.ä. was sie macht, also im fall der java api spezifikation erläutert die spezifikation was die einzelnen klassen und interfaces für funktionen haben und was diese erfüllen. 
ist eine api in java also eine klasse oder ein interface dass ich in der java api spezifikation finde? also wäre zum beispiel die klasse String somit eine API?


----------



## Spacerat (13. Jan 2010)

Nicht wirklich...
Die Klasse [c]String[/c] ist nur Teil dieser API. API heisst "Application Programming Interface" oder zu deutsch "Programmierschnittstelle für Anwendungen". Solche APIs beinhalten viele solcher Klassen. In der API-Beschreibung ist dann zu lesen, wofür und wie man die einzelnen Klassen verwenden kann. Ein Interface ist zwar immer eine Schnittstelle, aber ein Java-Interface ist deswegen noch lange kein API. Ein API ist also mehr eine Art (Klassen-) Bibliothek.


----------



## BlubBlub (13. Jan 2010)

hmm kannst du mir vielleicht ein konkretes beispiel in bezug auf java zeigen, woran ich genau sagen  "DAS ist eine api" ? 
ist das eher so eine art sammlung, also halt biblitothek aller klassen und interfaces die zur verfügung stehen, oder gibt es irgendwie merkmale an denen ich halt sagen kann, wenn das und das und das erfüllt ist dann ist das eine api. 

also kann man das so erklären wie wenn man zum beispiel jemanden erklären würde was eine klasse in java ist :
eine klasse besteht aus attributen und funktionien und dann könnte man demjenigen dann visuell anhand eines beispiels auch zeigen wie eine klasse aussieht, so dass man eine modelvorstellung davon hat. könnte das einer auch in bezug auf eine api machen?


----------



## Noctarius (13. Jan 2010)

Alle Java-Klassen die in java oder javax liegen bilden zusammen die Java-Standard-API


----------



## BlubBlub (13. Jan 2010)

ok, ich denke ich hab dann jetzt so ein ungefähres bild davon was eine api ist.
was mir jedoch noch nicht ganz so einleuchtet ist der begriff schnittstelle.
es gibt ja usb schnittstellen damit kann ich zum beispiel eine maus mit einem computer verbinden.
wie ist der begriff schnittstelle in bezug auf die java api zu verstehen. 
also wenn ich jetzt in java ein programm schreibe und dann schau ich mir in der java api spezifikation die verschiedenen
klassen an und entscheide mich nun die String klasse zu benutzen. die string klasse ist ja in der java api enthalten. wenn ich mir eclipse runterlade muss die api ja irgendwo in einem eclipse ordner enthalten sein muss. . und wo genau tritt da jetzt eine schnittstelle auf? zwischen welchen zwei "medien" ?(vielleicht zwischen dem programm dass ich grad selbst am schreiben bin in der entwicklungsumbegung eclipse und dem quelltext der string klasse , so dass ich beim meinem programm die klasse string verwenden kann oder so). die api ist eine programmierSCHNITTSTELLE, aber gleichzeitig ist sie auch ne art bibliothek das bringt mich wohl noch ein wenig durcheinander. weil für mich ist eine schnittstelle irgendetwas was zwei sachen miteinander verbindet ich könnte mir zum beispiel ne verbinung zwischen zwei programmen vorstellen , wobei eins in C geschrieben ist und eins in Java und dann würde man dann ne art übersetzer zwischen C und Java programmieren dass zum beispiel eine C datei in einer java datei wandelt und diese an das java programm schickt, dann wäre in diesem falle die programmierschnittstelle dieser "übersetzer". und eine bibliothekt wäre für mich halt einfach ne ansammlung von klassen und interfaces die ich verwenden kann.
ich hoffe ich konnte mein problem klar darstellen, wenn das zu verwirrend oder unverständlich ist was ich schreibe, dann tut mir das leid, ist irgendwie schwer den wissenstand und die modellvorstellung die man davon hat rüberzubringen, wenn man einige sachen noch nicht so unterscheiden kann.


----------



## Noctarius (13. Jan 2010)

Um bei Software zu bleiben nehmen wir die Grafikkarte und deren Treiber.
Grafikkarten werden alle anders behandelt, aber der Treiber sorgt dafür, dass das Betriebssystem immer genau weiß was es machen muss.

Der Treiber stellt einen definierten Satz an Funktionen zur Verfügung (in Java würde er vorzugsweise in passendes Interface implementieren) und damit ist die Art und Weise wie die GK angesprochen werden muss gekapselt und der Treiber stellt ein passendes, fest definiertes API an das Betriebssystem oder eben andere Programmierer zur Verfügung.


----------



## BlubBlub (13. Jan 2010)

okay das ist ein gutes beispiel, da konnte ich jetzt die funktion als SCHNITTSTELLE sehen.

das betriebssystem ist medium A ,
das Gerät ist medium B 
und der treiber ist die api. 
(Hierbei stellt die API eine verbindung zwischen einer Hardware und einer Software her)
(also Software - API - Hardware)

das beispiel was ich eben angeführt hatte.
ich hab ein programm in C
einen übersetzter (irgendwie software mässig umgesetzt)
und ein porgramm in Java
hier wäre der übersetzter meine API, weils ja auf quelltexteben geschieht und zwischen den beiden programmen eine kommunikation herstellt, nicht wahr?
(Hierbei stellt die API eine verbindung zwischen zwei programmen her)
(also Software - API - Software)

Anmerkung: Die API ist immer eine Software

und wie könnte ich das auf eclipse und java analog projezieren?
die entwicklungsumgebung eclipse ist medium A,   
 und was ist medium B?                        , 
Alle Java-Klassen die in java oder javax liegen bilden zusammen die Java-Standard-API 
(Hierbei stellt die API bestimmt eine verbindung zwischen zwei programmen her)
(also Software - API - Software)
oder muss ich hier einfach sagen das der begriff api hier vielmehr eine bibliothek und keine schnittstelle
meint.

das beispiel mit dem treiber hab ich verstanden, weil da wirklich eine schnittstellenfunktion auftritt.
du hast aber noch die aussage gemacht "Alle Java-Klassen die in java oder javax liegen bilden zusammen die Java-Standard-API "
Somit kann die API als Bibliothek und als Schnittstelle angesehen werden.
Quasi wie beim licht mit dem welle-teilchen verhalten. je nach anwendungsfall stellt man sich das licht als welle oder als teilchen vor.

aber auf jedenfall schonmal
danke für die erläuterungen, die haben mir schonmal ein etwas klareres bild davon gemacht was ne api ist.


----------



## Noctarius (13. Jan 2010)

Jein die API kapselt normalerweise Funktionalität.
Die Java Implementierung ist dann quasi die Grafikkarte (es gibt Implementierungen von IBM, SUN, das OpenJDK usw - selbst die SUN Implementierungen unterscheiden sich je nach Betriebssystem intern) und die Standard-API gibt dir nach außen hin (dein Programm) eine feste Funktionalität. Wie diese erreicht wird ist dabei in erster Linie egal.

Ob Java, wenn du ein Fenster haben willst, auf GTK (unter Gnome) oder QT (unter KDE) oder das Windows API zurückgreift um dieses zu zeichnen ist dir egal, du willst nur das Fenster, und dass es sich so verhält wie du es erwartest. Das erreichst du halt in dem du eine Funktion "createWindow" an den Programmierer frei gibst (in diesem Fall die API) und die spezifischen Implementierungen dahinter versteckst.

Eine API kann groß sein, wie bei der Java Standard-API, kann aber auch klein sein, z.B. für einen Dateireader wo im Hintergrund durch mehrere Implementierungen unterschiedliche Dateiformate eingelesen werden. Letzteres ist z.B. bei ImageReadern der Fall. Vorne kommt immer ein Image raus, hinten ließt er aber mal JPEG, mal GIF oder BMP oder oder oder.


----------



## Jango (13. Jan 2010)

Schnittstellen/Interface sind immer Verbindungen.
Die USB-Schnittstelle verbindet deine maus mit dem Computer. Das API verbindet dein Programm (software) mit dem Computer. 
Hoffe, das war einfach genug.


----------



## Wortraum (13. Jan 2010)

Eine Programmierschnittstelle ermöglicht dem Programmierer den Zugriff auf andere Anwendungen, andere Systeme oder deren Funktionen. JDBC beispielsweise ist eine Datenbankschnittstelle – also allgemeiner eine API –, die Klassen anbietet, mit denen sich einfach eine Verbindung zu einer Datenbank herstellen und sich Daten lesen oder schreiben lassen. Dazu können dann Klassen gehören, die Datenbankanweisungen (SQL-Anweisungen) repräsentieren, die abgefragte Datenbanksätze enthalten oder die als Ausnahmen bestimmte Funktionen erfüllen, beispielsweise SQLSyntaxErrorException. Zur API können auch Schnittstellenklassen (Interfaces) gehören oder Treiber, über die wie hier auf eine Datenbank zugegriffen wird.

Der Programmierer selbst muß sich um Details nicht mehr kümmern, er muß nur wissen, wie die Schnittstelle funktioniert. Wie nun eine Verbindung über ein Netz zu einer Datenbank aufgebaut wird, wie die Klasse java.sql.Time die Zeit darstellt, damit sie in eine Datenbank geschrieben werden kann, das ist Sache der Schnittstelle.

Abstrakter wird es, wenn man sich Klassen wie String anschaut, die zur Java-API gehören. Der Programmierer kann damit komfortabel Zeichenketten verwalten, doch wie sie intern von Java oder der JVM (virtuelle Maschine) kodiert werden, das muß er nicht wissen.

Ein anderes Beispiel ist java.io. Hier gibt es Klassen, mit denen sich Dateien lesen oder schreiben lassen, aber wie die JVM das bewerkstelligt und welche Schnittstellen des Betriebssystems sie wiederum nutzt, das muß man nicht wissen. Da die JVM auf unterschiedlichen Betriebssystemen und unterschiedlicher Gerätschaft läuft, kann das sogar auf einem anderen Rechner ganz anders funktionieren – der Programmierer sieht jedoch nur seine Schnittstelle, und die bleibt gleich: schreibene mit write(), lesen mit read(), wenn man es so grob vereinfachen möchte.

Noch ein Beispiel wäre eine API zum Lesen oder Schreiben von XML-Dateien, so daß der Programmierer einfach in einer Vorschleife alle Tags durchlaufen und dort mit einfachen Methodenaufrufen wie getNextAttribute() auf Attribute zugreifen kann, ohne sich um das Lesen von Zeichen aus einer XML-Datei oder deren Aufbau zu kümmern.

Eine Programmierschnittstelle ist also recht allgemein und nicht mehr als ein Übergang zu einem anderen System, anderen Anwendungen, anderen Funktionen, ob es nun eine Zeichenkette ist, der Zugriff auf das Druckersystem oder gleich eine Schnittstelle zur 3D-Beschleunigung (OpenGL) oder zum Auslesen von Satellitenbildern der Nasa (World Wind).

Man kann es auch anders sagen: Es ist eine Abstraktionsschicht, hinter der sich ein komplexeres System verbirgt. Deren Funktionsweise und Details werden hinter einer einfachen Schnittstelle verborgen und damit abgekoppelt. Damit können sie auch unabhängig geändert und verbessert werden, so lange die Schnittstelle gleich bleibt.

Und noch ein Bild für den absoluten Laien: Eine Programmiererschnittstelle ist aus Sicht eines Programmiers eine programmiererfreundliche Schalttafel, so wie der Musikfreund vor seiner Dolby-Surround-Anlage steht, viele Knöpfe und Schalter sieht, die alle etwas tolles machen, während das Wie in dem Kasten dahinter versteckt ist. Bei Software kommt noch hinzu, daß sich das Wie ändern kann.


----------



## BlubBlub (13. Jan 2010)

ok vielen herzlichen dank an euch, das hat mir enorm weiter geholfen bzgl. des verständnisses was eine api ist.
nochmals danke für die mühe und die vielen guten antworten, vorallem auch für die erklärung anhand von beispielen.


----------

