[Koha-devel] Restful API question
Stephen Graham
s.graham4 at herts.ac.uk
Mon May 20 13:17:50 CEST 2019
Hi all - I know it's Kohacon this week so a lot of people will be busy there, but just in case ......... (also sorry for the length of the email!):
I testing creating a custom API endpoint using the Koha plugin system. I've been using the code in the Kitchen sink plugin as a template, and it seems to be working well apart from my lack of Swagger/OpenAPI knowledge - I think it's this I struggling with. I have three files:
koha-dev/var/lib/plugins/Koha/Plugin/Uk/Ac/Herts/Notifications.pm
koha-dev/var/lib/plugins/Koha/Plugin/Uk/Ac/Herts/Notifications/NotificationController.pm
koha-dev/var/lib/plugins/Koha/Plugin/Uk/Ac/Herts/Notifications/openapi.json
The work is done in NotificationController.pm where I have a DBI call to get the following fields:
Borrower.userid
Message_queue.message_id
Message_queue.subject
Message_queue.content
I fetch the data, and convert into JSON (encode_json is a method from Mojo::JSON) like:
my $data = $sth->fetchall_arrayref({}); # return both fieldnames and values
my $json = encode_json($data);
if I then do (i.e. use text):
return $c->render( status => 200, text => $json)
it works fine. If I call https://herttest-staff.koha-ptfs.co.uk/api/v1/contrib/UH/notifications I get json like:
[ {
"body": "blah blah",
"messageid": "1234567",
"subject": "Important...",
"userid": 99999999"
} {
Etc etc
}]
So in Perl terms it's an array of hashes. Which is what I want. However, if I try and use the openapi way that all the current "official" Koha endpoints use e.g.
return $c->render( status => 200, openapi => { notices => $json } );
it just doesn't work. I have tried to map the field names with the appropriate types in openapi.json. I've tried object type with properties e.g.
"responses": {
"200": {
"description": "A list of pending notices",
"schema": {
"type": "object",
"properties": {
"userid": {
"type": "string",
"description": "Unique User ID"
}, etc
, and I've tried array type with items:
"responses": {
"200": {
"description": "A list of pending notices",
"schema": {
"type": "array",
"items": {
"userid": {
"type": "string",
"description": "Unique User ID"
}, etc
But I get a page not found error. When I pass my $json variable to the render method using openapi how do I get it to work? I'm happy to use the text way, but I want to understand where I'm going wrong. Any ideas, hints, tips would be most welcome!
Cheers, Stephen
--------------------------------------
Stephen Graham
Library Technology Consultant
Content and Collections Team
Library and Computing Services
University of Hertfordshire
Tel: 01707 286111
Ext: 77751
Email: s.graham4 at herts.ac.uk<mailto:s.graham4 at herts.ac.uk>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.koha-community.org/pipermail/koha-devel/attachments/20190520/689d4ffd/attachment.html>
More information about the Koha-devel
mailing list