HTTP

HTTP

Hypertext Transfer Protocol

= Protokoll, auf dessen Basis Resourcen über das Netzwerk angefragt und übertragen werden können

HTTP

Paar: Anfrage - Antwort

Anfrage: meist aus dem Browser

Antwort: kommt vom Server

HTTP Anfragen und Antworten werden wiederum über ein "niedrigeres" Protokoll übertragen, üblicherweise TCP.

HTTP

Anfrageformat:

  • Anfragezeile
  • Header-Felder
  • Body (optional)

Antwortformat:

  • Statuszeile
  • Header-Felder
  • Body (optional)

Experimentieren mit HTTP

Möglichkeiten:

  • Browser-Tools unter "Netzwerkanalyse"
  • VS Code Plugin HTTP Client

HTTP: Beispiel Wikipedia

Anfrage:

GET /wiki/Main_Page HTTP/2.0
Host: en.wikipedia.org
Connection: keep-alive

Antwort:

HTTP/2.0 200 OK
Date: Wed, 24 Apr 2019 07:50:41 GMT
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html ...

HTTP: Beispiel Wikipedia Suche (1)

Anfrage:

GET /w/index.php?search=test&title=Special:Search&go=Go HTTP/2.0
Host: en.wikipedia.org
Connection: keep-alive

Antwort:

HTTP/2.0 302 Found
Location: https://en.wikipedia.org/wiki/Test
Content-Length: 0

HTTP: Beispiel Wikipedia Suche (2)

Anfrage:

GET /wiki/Test HTTP/2.0
Host: en.wikipedia.org
Connection: keep-alive

Antwort:

HTTP/2.0 200 OK
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html ...

HTTP: Beispiel POST-Request

Anfrage:

POST /submit-posting HTTP/2.0
Host: example.com
Connection: keep-alive
Content-Type: text/plain; encoding=UTF-8
Content-Length: 33

This is the post content (body)

Antwort:

HTTP/2.0 200 OK
Content-Type: text/html; charset=UTF-8

...

HTTP: Beispiel API

GET /todos/12
Host: jsonplaceholder.typicode.com
Connection: keep-alive
HTTP/2.0 200 OK
Content-Type: application/json; charset=utf-8
Etag: W/"5c-cn8o...

{
  "userId": 1,
  "id": 12,
  "title": "ipsa repellendus fugit nisi",
  "completed": true
}

wichtige Anfrage-Headerfelder

  • Host
  • Connection
  • Origin
  • Accept
  • Accept-Encoding
  • Cookie
  • Cache-Control
  • Authorization

Wichtige HTTP-Statuscodes

  • 200 OK
  • 301 Moved Permanently
  • 307 Temporary Redirect (Weiterleitung auf eine andere Adresse)
  • 303 See Other (Weiterleitung auf eine andere Adresse, Methode ändert sich zu GET)
  • 308 Permanent Redirect
  • 304 Not Modified (Resource hat sich seit letzter Anfrage nicht geändert)

Wichtige HTTP-Statuscodes

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 500 Internal Server Error

siehe auch: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

wichtige Antwort-Headerfelder

  • Content-Length
  • Content-Type
  • Set-Cookie
  • Location
  • Cache-Control

Headerfeld "Content-Type"

Mögliche Werte:

  • text/plain; charset=utf-8
  • text/html; charset=utf-8
  • application/json
  • application/javascript
  • application/ecmascript
  • image/jpeg
  • image/png
  • ...

Headerfeld "Set-Cookie"

Beispiel:

GET /
Host: www.google.com

Set-Cookie: 1P_JAR=2019-04-24-08; expires=...; path=/; domain=.google.com
Set-Cookie: IDCC=AN0-TYtU7...fo; expires=...; path=/; domain=.google.com

HTTP APIs

HTTP APIs

HTTP API / Web API = Möglichkeit, Datensätze zwischen Client und Server auszutauschen

HTTP APIs

Standards:

  • XML-RPC (1998)
  • SOAP (1999)
  • JSON-RPC (2005)
  • REST (2000)
  • GraphQL (2015)

HTTP APIs

Anfrageformat:

  • SOAP: XML
  • JSON-RPC: JSON
  • REST: HTTP Methode + URL (+ URL Parameter) (+ Request Body)
  • GraphQL: GraphQL Abfragesprache

Antwortformat:

  • SOAP: XML
  • JSON-RPC: JSON
  • REST: oft JSON (oder XML, ...)
  • GraphQL: JSON

Vergleich von REST, JSON-RPC und GraphQL

  • vorgegebene vs flexible Queries
  • protokollabhängig vs protokollunabhängig

Vorgegebene vs flexible Queries

REST, JSON-RPC: Endpunkte / Methoden sind vorgegeben (z.B. posts_of_friends, suggested_friends, ...)

GraphQL: Client kann eigene Query flexibel zusammenstellen

Vorteil von GraphQL: Flexibler, neue Funktionalität benötigt oft keinen zusätzlichen Backend-Code

Nachteil von GraphQL: Benötigt oft zusätzlichen Code um Zugriffe zu beschränken (z.B. Verhindern, auf Posts von vorgeschlagenen Freunden zuzugreifen)

Protokollabhängig vs protokollunabhängig

REST wird üblicherweise mit HTTP verwendet, API-Aufrufe werden durch die HTTP-Methode unterschieden (get, post, ...)

JSON-RPC und GraphQL können mit anderen Protokollen verwendet werden, z.B. WebSockets

JSON-RPC

RPC = remote procedure call

JSON-RPC

Beispiel für Request-Body:

{
  "jsonrpc": "2.0",
  "method": "get_todo_by_id",
  "params": { "id": 1 },
  "id": 1234
}

Beispiel für Response-Body:

{
  "jsonrpc": "2.0",
  "error": null,
  "result": [
    { "id": 1, "title": "groceries", "completed": false }
  ],
  "id": 1234
}

REST

REST = Representational State Transfer

Hauptsächlich via HTTP Requests mit diesen Methoden:

  • Abfragen von Elementen via GET
  • Hinzufügen eines Elements via POST
  • Hinzufügen eines Elements unter einer bestimmten URL via PUT
  • Ändern von Elementen via PATCH
  • Ersetzen von Elementen via PUT
  • Löschen von Elementen via DELETE
  • alle anderen Änderungen via POST

REST Beispiele

get: Abfrage mehrerer Elemente:

GET /todos HTTP/2.0
Host: jsonplaceholder.typicode.com

get: Abfrage eines einzelnen Elements:

GET /todos/2 HTTP/2.0
Host: jsonplaceholder.typicode.com

get: Abfragen mehrerer Elemente:

GET /todos?userId=1&completed=false
Host: jsonplaceholder.typicode.com

REST Beispiele

post: Hinzufügen eines Eintrags:

POST /todos HTTP/2.0
Host: jsonplaceholder.typicode.com
Content-Type: application/json
Content-Length: 27

{
  "title": "learn REST",
  "completed": false
}

REST Beispiele

patch: Ändern eines Eintrags:

PATCH /todos/6 HTTP/2.0
Host: jsonplaceholder.typicode.com
Content-Type: application/json
Content-Length: 23

{
  "completed": true
}

REST Beispiele

delete: Löschen eines Eintrags:

DELETE /todos/6 HTTP/2.0
Host: jsonplaceholder.typicode.com

REST Beispiele

post: Andere Anfragen (Löschen aller erledigter Todos):

POST /todos/delete_completed HTTP/2.0
Host: ...

Resourcen

Beispiele für REST APIs: