Im Original von Julian Ladisch
Hier werden verschiedene Möglichkeiten erklärt, direkt auf die Inventorydaten (Instance, Holding, Item, usw.) zuzugreifen.
Die Erklärung/Dokumenation der einzelnen Felder ist auf https://dev.folio.org/reference/api/#mod-inventory-storage , dazu in der entsprechenden Zeile auf view-1 klicken, dann in der Zeile mit {...id} auf GET klicken, in dem sich öffnenden Fenster dann auf Response. Beispiellink für Item.
Browser
Chrome und Firefox haben Developertools, die sich mit Strg+Umschalt+I anschalten lassen. Dort im Tab Network erscheinen im Untertab Response die Antworten des Inventory-Backends:
...
Image Added
API mit curl
Mit einem Kommandozeilentool wie curl
kann man auf die APIs zugreifen. Eine Liste möglicher Kommandozeilentools steht auf https://dev.folio.org/faqs/how-to-use-apis/
Als Beispiele für die OKAPI-Adresse können https://folio-snapshot-stable-okapi.aws.indexdata.com
und https://folio-demo.gbv.de/okapi
dienen.
Instances
Shellskriptbeispiel get-instance.sh:
get-instance.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" )
CQL=$( echo "$1" | sed 's/ /%20/g; s/"/%22/g; s/\\/%5c/g' )
echo "$CQL"
curl "${OPT[@]}" "$OKAPI/instance-storage/instances?query=$CQL"
|
Dieses Skript kann man mit ./get-instance.sh "title=baby"
aufrufen, um die Instances, die baby im Titel enthalten, anzuzeigen.
Bei Bedarf die Maxmimalzahl zurückgelieferter Datensätze ändern: ./get-instance.sh "title=the*&limit=1"
Ist die UUID bekannt, kann man sich den Datensatz direkt holen:
curl "${OPT[@]}" "$OKAPI/instance-storage/instances/$UUID"
Oder man nutzt dieses Skipt mit
./get-instance-by-id 7fbd5d84-62d1-44c6-9c45-6cb173998bbd > studien.json
get-instance-by-id.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -D - -s -S -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
RESULT=$( curl -w '\n' -D - -s -S -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-H "Accept: text/plain" $OKAPI /instance-storage/instances/ $1 )
if echo "$RESULT" | grep -q "^HTTP/1.1 200"
then
echo "$RESULT" | sed '1,/^\r*$/d'
exit 0
fi
echo "$RESULT" 1>&2
exit 1
|
Eine Instance, dessen Daten in einer JSON-Datei (z.B. studien.json) stehen, kann man mit ./post-instance.sh studien.json
anlegen:
post-instance.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" )
curl "${OPT[@]}" -d "@$1" $OKAPI /instance-storage/instances
|
Um eine Instance zu ändern, muss die id (z.B. 6a22bd5b-645e-411f-9446-597b5e659fc2) bekannt sein, dann kann man ./put-instance.sh 6a22bd5b-645e-411f-9446-597b5e659fc2 studien.json
aufrufen, bei erfolgreichem Update antwortet der Server mit "HTTP/1.1 204 No Content":
put-instance.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain" )
curl "${OPT[@]}" -d "@$2" -XPUT "$OKAPI/instance-storage/instances/$1"
|
Analog mit ./delete-instance.sh 6a22bd5b-645e-411f-9446-597b5e659fc2
das Löschen:
delete-instance.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain" )
curl "${OPT[@]}" -XDELETE "$OKAPI/instance-storage/instances/$1"
|
Holdings
get-holding.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" )
CQL=$( echo "$1" | sed 's/ /%20/g; s/"/%22/g; s/\\/%5c/g' )
echo "$CQL"
curl "${OPT[@]}" "$OKAPI/holdings-storage/instances?query=$CQL"
|
get-holding-by-id.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -D - -s -S -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
RESULT=$( curl -w '\n' -D - -s -S -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-H "Accept: text/plain" $OKAPI /holdings-storage/holdings/ $1 )
if echo "$RESULT" | grep -q "^HTTP/1.1 200"
then
echo "$RESULT" | sed '1,/^\r*$/d'
exit 0
fi
echo "$RESULT" 1>&2
exit 1
|
post-holding.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" )
curl "${OPT[@]}" -d "@$1" $OKAPI /holdings-storage/holdings
|
put-holding.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain" )
curl "${OPT[@]}" -d "@$2" -XPUT "$OKAPI/holdings-storage/holdings/$1"
|
delete-holding.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain" )
curl "${OPT[@]}" -XDELETE "$OKAPI/holdings-storage/holdings/$1"
|
Items
get-items.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" )
CQL=$( echo "$1" | sed 's/ /%20/g; s/"/%22/g; s/\\/%5c/g' )
echo "$CQL"
curl "${OPT[@]}" "$OKAPI/item-storage/items?query=$CQL"
|
get-item-by-id.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -D - -s -S -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
RESULT=$( curl -w '\n' -D - -s -S -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-H "Accept: text/plain" $OKAPI /item-storage/items/ $1 )
if echo "$RESULT" | grep -q "^HTTP/1.1 200"
then
echo "$RESULT" | sed '1,/^\r*$/d'
exit 0
fi
echo "$RESULT" 1>&2
exit 1
|
post-item.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" )
curl "${OPT[@]}" -d "@$1" $OKAPI /item-storage/items
|
put-item.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain" )
curl "${OPT[@]}" -d "@$2" -XPUT "$OKAPI/item-storage/items/$1"
|
delete-item.sh
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
-d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain" )
curl "${OPT[@]}" -XDELETE "$OKAPI/item-storage/items/$1"
|
Service Points
Wegen schwieriger, noch nicht programmierter Konsistenzprüfung (https://
...
folio-org.
...
atlassian.
...
net/browse/UIORG-129) wird der "Delete Service Point"-Button im Frontend nicht angezeigt (https://
...
folio-org.
...
atlassian.
...
net/browse/UIORG-130). Man muss Service Points auf eigenes Risiko über das Backend löschen:
delete-service-point.sh
USERNAME= "${USERNAME:-diku_admin}"
PASSWORD= "${PASSWORD:-admin}"
TENANT= "${TENANT:-diku}"
OKAPI= "${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: $TENANT" -H "Content-type: application/json" \
-d '{"tenant":"$TENANT","username":"$USERNAME","password":"$PASSWORD"}' $OKAPI /authn/login | grep -i "^x-okapi-token: " )
OPT=(-w "\n" -s -S -D - --http1.1 -H "$TOKEN" -H "X-Okapi-Tenant: $TENANT" -H "Content-type: application/json" -H "Accept: text/plain" )
curl "${OPT[@]}" -XDELETE $OKAPI /service-points/ $1
|
API mit Postman
Mit der Postman-App, die es kostenlos auf https://www.getpostman.com/downloads/ gibt, kann man per GUI und komfortabel API-Abfrageskripte schreiben. Beispiel-Postman-Skripte:
https://gist.github.com/julianladisch/b5239149fc8cbe0f474d2464c7e01108
SQL
Hat man direkten Zugriff auf die Installation, kann man mit dem Kommandozeilentool psql auf die PostgreSQL-Datenbank zugreifen.
Beispiel:
In die Vagrant-Box einloggen:
vagrant ssh
Nun psql aufrufen:
PGPASSWORD=folio_admin psql -h localhost okapi_modules folio_admin
Alle Tabellen von mod_inventory_storage anzeigen:
\dt diku_mod_inventory_storage.*
Eine Instance anzeigen, die baby im Titel enthält:
SELECT * FROM diku_mod_inventory_storage.instance WHERE jsonb->>'title' ILIKE '%baby%' LIMIT 1;
Instance, Holding und Item anzeigen für ein ausgeliehenes Item:
SELECT * FROM diku_mod_inventory_storage.instance_holding_item_view WHERE it_jsonb->'status'->>'name'='Checked out' LIMIT 1;
HRID-Handling
Für Instances: https://
...
folio-org.
...
atlassian.
...
net/browse/MODINV-160
Für Holdings: https://
...
folio-org.
...
atlassian.
...
net/browse/MODINV-161
Für Items: https://
...
folio-org.
...
atlassian.
...
net/browse/MODINV-162