API mit cURL anfragen

Immer wenn der Inhalt einer externen Web page geparst werden muss, kommt cURL ins Spiel.
Eine einfache Anfrage auf Kommandozeilenebene:

curl http://www.chrisrolle.com/blog

gibt etwas HTML zurück:

<!DOCTYPE html>
<html lang='en'>
  <head>
    <title>Christian Rolle</title>
    <!-- 
          some HTML 
     -->
</html>

Aber cURL kann so viel mehr.

cURL Anfrage Header

Der Anfrage Header kann mit der Option -H gesetzt werden:

curl -H "Accept: application/json" \
    http://www.chrisrolle.com/blog

Falls die API auf eine JSON Anfrage antworten kann, könnste sie so aussehen:

{
  "articles":[
    { "title":"ActiveRecord equality - explained" },
    { "title":"Benchmark vs. question mark" }
  ]
}

Für einige Standard HTTP Header Felder, wie User-Agent, Cookie and Host, gibt es auch andere Möglichkeiten, sie zu setzen:

  • -A (oder –user-agent): für das “User-Agent” Feld
  • -b (oder –cookie): für das “Cookie” Feld
  • -e (oder –referer): für das “Referer” Feld

Wenn der User-Agent manipuliert werden soll:

curl -A "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5" http://www.chrisrolle.com

oder die Referer URL:

curl --referer http://google.com http://www.chrisrolle.com

und sogar der Cookie:

curl --cookie Sw33t-C00k1e-5ess10n-1D http://www.chrisrolle.com

cURL mit Parametern

Manchmal müssen zusätzliche Parameter mitgeschickt werden (Option -d):

$ curl -X GET -H "Accept: application/json" -d "search=question" http://www.chrisrolle.com/blog

und die eingeschränkte Antwort:

{
  "articles":[
    { "title":"Benchmark vs. question mark" }
  ]
}

cURL Antwort Header

Der Antwort Header kann mit der Option -I (oder –head) analysiert werden:

$ curl --head http://www.chrisrolle.com
HTTP/1.1 200 OK
Server: Cowboy
Date: Sun, 5 Jun 2016 10:44:35 GMT
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=0; includeSubDomains
Content-Type: text/html; charset=utf-8
Etag: W/"f0f8147b4d242b90067f4bfd2873b836"
Cache-Control: max-age=0, private, must-revalidate
Set-Cookie: request_method=HEAD; path=/
Set-Cookie: _session=xxx; path=/; HttpOnly
X-Request-Id: e8fa64a4-36c8-9111-8322-126a0d236bc9
X-Runtime: 0.163079
Via: 1.1 vegur

Wenn Sessionabhängige Anfragen ausgeführt werden sollen, kann der Cookie auch in einer Datei abgelegt werden:

curl --cookie-jar cookie.txt http://www.chrisrolle.com

zur späteren Verwendung:

curl --cookie cookie.txt http://www.chrisrolle.com

cURL als Formularersatz

Ein Formular submit kann ebenfalls simuliert werden. Dabei wird POST als Standard HTTP Verb für Formulare explizit gesetzt und die entsprechenden Parameter mitgeschickt:

curl -X POST -d 'id=123&person[name]=Christian' http://example.com/form

Für Multipart Formulare gibt eine eigene Option -F (oder –form):

curl --form upload=@people.csv --form press=submit http://example.com/form

Weitere Optionen sind in der Manpage beschrieben.