API elérése és authentikáció
2021.11.11 — Posted by Webb & Flow
API elérése
Az API végpont a https://cloudapi.conycms.com domain alatt érhető el. A végpont bármilyen HTTP klienssel hívható, amivel megvalósítható a jelen dokumentumban leírt kommunikáció.
Kommunikáció formátuma
A ConyCMS API szabványos REST API hívásokkal érhető el, ennek megfelelően a különböző célú végpontokat különböző HTTP metódusokkal lehet hívni. Bizonyos esetekben ugyanazt a végpontot több metódussal is hívhatjuk, ebben az esetben a metódus határozza meg az elvárt működést. Ilyen például egy konkrét bejegyzés
- megnyitása
- módosítása
- törlése mely esetben ugyanazt a végpontot kell hívni különböző HTTP metódusokkal.
Az API végpontok JSON formátumban kommunikálnak.
HTTP GET
A GET metódusú hívásokkal lehet adatokat lekérni. Ezek a hívások egy konkrét elemet, vagy több elem listáját adják vissza.
HTTP POST
A POST metódusú hívásokkal lehet új bejegyzést létrehozni. Egy ilyen hívás egyszerre egy bejegyzést hoz létre.
HTTP PATCH
A PATCH metódusú hívásokkal lehet egy létező bejegyzést módosítani.
HTTP DELETE
A DELETE metódusú hívásokkal lehet egy létező bejegyzést törölni. A ConyCMS verziókezelő funkciója miatt csak bizonyos adatokat lehet véglegesen törölni, ahol státusz állítással lehet töröltnek jelölni egy bejegyzést, az az eset módosításnak számít.
Visszatérési érték
Az API végpontok a HTTP kérésre adott HTTP státusszal, és a visszaadott JSON formátumú adattal jelzik, hogy az adott hívásnak mi lett az eredménye.
A végpontok által visszaadott adat pontos tartalma az adott végpont dokumentációjában található. A következő HTTP státusz kódok fordulhatnak elő a hívások során:
HTTP 200
A hívás sikeres volt. Amennyiben másképp nincs meghatározva, a hívások ezzel a státusszal térnek vissza. Bizonyos hívások hiba esetén is ezzel a státusszal térnek vissza, ekkor a visszaadott adatban részletezik, hogy mi volt a probléma.
HTTP 201
A hívás sikeres volt, létre lett hozva egy új bejegyzés. Egyes POST metódusú hívások ezzel a státusszal térnek vissza, ha sikeresen létrehoztak egy új bejegyzést.
HTTP 204
A hívás sikeres volt, nem kell adatot visszaadni. Egyes DELETE metódusú hívások ezzel a státusszal térnek vissza, ha sikeresen töröltek egy új bejegyzést. Ennél a státusznál mindig üres a response body.
HTTP 401
Authentikációs probléma. Az adott végpont használatához authentikálni kell a felhasználót, de ez nem sikerült. Ennek a főbb okai: nem lett megadva az authentikációs token hibás a token formátuma hibás vagy korrupt a token tartalma lejárt a token
HTTP 403
Jogosultsági probléma. A felhasználónak nincs joga az adott végponthoz, vagy az adott végpont által kezelt bejegyzéshez.
HTTP 404
Az adott API végpont nem létezik, vagy nem hívható az adott HTTP metódussal.
HTTP 409
Általános probléma a beküldött adatokkal. Általában POST, illetve PATCH metódusú hívásoknál fordul elő, amennyiben a beküldött adattal valamilyen probléma van.
HTTP 410
A bejegyzés nem található.
HTTP 500
Rendszer hiba.
CORS
Az összes API végpont hívható OPTIONS HTTP metódussal, ezek a hívások minden esetben HTTP 200 státusszal térnek vissza (akkor is, ha az adott végpont nem létezik), és a válasz fejlécei között szerepelnek a CORS bejegyzések:
Header | Érték |
---|---|
Access-Control-Allow-Origin | * |
Access-Control-Allow-Headers | X-Requested-With, Authorization, Content-Type |
Access-Control-Allow-Methods | POST, GET, PUT, DELETE, PATCH, OPTIONS |
Access-Control-Allow-Credentials | true |
Emiatt közvetlenül böngészőből, JavaScript segítségével AJAX hívásokat is lehet indítani az API felé.
Fontos, hogy az Access-Control-Allow-Methods értéke minden esetben ugyanaz, így nem használható annak lekérésére, hogy valójában milyen HTTP metódusokkal lehet az adott végpontot hívni.
Authentikáció
Az API végpontok használata authentikációhoz kötött, ez alól csak azok a kivételek, ahol ez kifejezetten jelezve van a dokumentációban.
Az authentikációhoz a HTTP kérés fejlécei között az Authorization header-ben kell egy Bearer tokent küldeni.
Az authentikációs tokent a login végponton lehet lekérni, egy meglévő tokent pedig az aktuális user lekérésével lehet tesztelni.
Login
POST /user/login
{
"username": "user@example.com",
"password": "MyT0pSecretPassw0rd"
}
A sikeres belépés esetén a következő választ adja a végpont:
{
"authToken": "very_long_authorization_token_string"
}
PHP példa kód:
<?php
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => 'https://cloudapi.conycms.com/user/login',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{"username": "user@example.com","password": "MyT0pSecretPassw0rd"}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
)
);
$response = curl_exec($curl);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$responseBody = substr($response, $headerSize);
$responseObject = json_decode($responseBody, true);
$authToken = isset($responseObject['authToken']) ? $responseObject['authToken'] : null;
Aktuális user lekérés
Ennél a végpontnál már küldeni kell a kérés fejlécei között az authentikációs tokent.
GET /user/current
Amennyiben érvényes a token, a következő választ adja a végpont:
{
"username": "user@example.com"
}
PHP példa kód:
<?php
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => 'https://cloudapi.conycms.com/user/current',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer very_long_authorization_token_string'
),
)
);
$response = curl_exec($curl);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$responseBody = substr($response, $headerSize);
$responseObject = json_decode($responseBody, true);
$userName = isset($responseObject['username']) ? $responseObject['username'] : null;