Skip to end of banner
Go to start of banner

Inventory-Zugriff

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

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:

API mit curl

Mit einem Kommandozeilentool wie curl kann man auf die APIs zugreifen.

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' # urlencode
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' # urlencode
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' # urlencode
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://issues.folio.org/browse/UIORG-129) wird der "Delete Service Point"-Button im Frontend nicht angezeigt (https://issues.folio.org/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://issues.folio.org/browse/MODINV-160

Für Holdings: https://issues.folio.org/browse/MODINV-161

Für Items: https://issues.folio.org/browse/MODINV-162

  • No labels