REST API/OpenAPI/Swagger
by IT-Projects LLC https://t.me/sync_studio , Ivan Yelizariev https://t.me/sync_studioAvailability |
Odoo Online
Odoo.sh
On Premise
|
Odoo Apps Dependencies |
Discuss (mail)
|
Community Apps Dependencies | Show |
Lines of code | 1980 |
Technical Name |
openapi |
License | LGPL-3 |
Website | https://t.me/sync_studio |
Versions | 11.0 8.0 14.0 13.0 10.0 16.0 15.0 12.0 |
REST API/OpenAPI/Swagger
Secure tool for convenient integrations
Version: v14.0.1.2.4
Tested and maintained by
IT Projects Labs
Assitance: help@itpp.dev
- Grant exact access rights needed for an integration
- Load generated OpenAPI Specification into Postman, Swagger Editor or any other tools that supports it
- Use new class methods to execute typical integration task in a single request
- Monitor API requests/responses at desired level of details
Easy to use in any programming languages
# https://github.com/Yelp/bravado from bravado.requests_client import RequestsClient from bravado.client import SwaggerClient http_client = RequestsClient() http_client.set_basic_auth('yourdomain.example.com', 'DATABASE-NAME', 'USER-TOKEN') odoo = SwaggerClient.from_url( 'https://yourdomain.example.com/api/v1/demo/swagger.json?token=demo_token&db=source', http_client=http_client ) result = odoo.res_partner.callMethodForResPartnerModel( method_name="search", body={ 'args': [[('email', '=', 'sync@it-projects.info')]] } ).response().incoming_response.json() partner_id = result and result[0] if not partner_id: result = odoo.res_partner.addResPartner(body={ "name": "OpenAPI Support", "email": "sync@it-projects.info" }).response().result partner_id = result.id odoo.res_partner.callMethodForResPartnerSingleRecord( id=partner_id, method_name="message_post", body={ "kwargs": { "body": "The Openapi module works in Python! Thank you!", "partner_ids": [partner_id] } } ).response()
Comming soon...
Comming soon...
Comming soon...
Comming soon...
Comming soon...
You may send this page to your IT guys to evaluate the possibilities or just tell us your concerns: help@itpp.dev
Let our expertise work for you!
(Doors and windows below are clickable)
/itpp-labs-1100.jpg)
/itpp-labs-930.jpg)
/itpp-labs-690.jpg)
REST API/Openapi/Swagger
Installation
Install python packages:
python3 -m pip install bravado_core swagger_spec_validator
Install this module in a usual way
Add openapi to --load parameter, e.g.:
./odoo-bin --workers=2 --load openapi,base,web --config=/path/to/odoo.conf
Note: Skipping this step may lead to error response:
werkzeug.exception.BadRequest: 400 Bad Request <..> : Function declared as capable of handling request of type 'apijson' but called with a request of type 'json'
Configuration
Activating and customization
Open menu [[ OpenAPI ]] >> OpenAPI >> Integrations
Click [Create]
Specify Name for integration, e.g. test
Set Log requests to Full
Set Log responses to Full
In Accessable models tab click Add an item
Set Model, for example res.users
Configure allowed operations
[x] Create via API
- Set Creation Context Presets, for example
- Name: brussels
- Context: {"default_tz":"Europe/Brussels", "default_lang":"fr_BE"}
- Set Creation Context Presets, for example
[x] Read via API
Set Read One Fields -- fields to return on reading one record
Set Read Many Fields -- fields to return on reading multiple records
Note: you can use Export widget in corresponding Model to create Fields list. To do that:
- Open menu for the Model
- Switch to list view
- Select any record
- click [Action] -> Export
- Set Export Type to Export all Data
- Add the fields you need to right column
- Click Save fields list, choose name and save the list
- Now the list is availab to set Read One Fields, Read Many Fields settings
[x] Update via API
[x] Delete via API
Click [Save]
Copy Specification Link to use it in any system that support OpenAPI
Authentication
- Activate Developer Mode
- Open menu [[ Settings ]] >> Users & Companies >> Users
- Select a user that will be used for iteracting over API
- In Allowed Integration select some integrations
- Copy OpenAPI Token to use it in any system that support OpenAPI
If necessary, you can reset the token by pressing [Reset OpenAPI Token] button
Usage
Swagger Editor
As the simplest example, you can try API in Swagger Editor. It allows to review and check API
- Open http://editor.swagger.io/
- Click menu File >> Import URL
- Set Specification link
- RESULT: Specification is parsed succefully and you can see API presentation
- Click [Authorize] button
- Username -- set database name
- Password -- set OpenAPI Token (how to get one is described in authentication above)
- Note:
The Swagger Editor sends requests directly from browser which leads to CORS error and work with it is not available in odoo.sh. The easiest solution is to simply copy-past the curl command from Swagger Editor and run it from the terminal.
Alternatively, you can grant CORS headers in your web server. Below is example for Nginx:
location /api/v1 { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*' 'always'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' 'always'; add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' 'always'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } if ($request_method = 'POST') { add_header 'Access-Control-Allow-Origin' '*' 'always'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' 'always'; add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' 'always'; } if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' '*' 'always'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' 'always'; add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' 'always'; } if ($request_method = 'PUT') { add_header 'Access-Control-Allow-Origin' '*' 'always'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' 'always'; add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' 'always'; } if ($request_method = 'DELETE') { add_header 'Access-Control-Allow-Origin' '*' 'always'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' 'always'; add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' 'always'; } if ($request_method = 'PATCH') { add_header 'Access-Control-Allow-Origin' '*' 'always'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' 'always'; add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' 'always'; } # ... }
How to call methods with arguments via API
Here is an example of calling a search method with domain.
This is how it is usually done from python code:
partner_ids = self.env["res.partner"].search([("is_company", "=", "True")])
On using API it would be as following:
curl -X PATCH "http://example.com/api/v1/demo/res.partner/call/search" -H "accept: application/json" \ -H "authorization: Basic BASE64_ENCODED_EXPRESSION" -H "Content-Type: application/json" \ -d '{ "args": [[["is_company", "=", "True" ]]]}'
Updating existing record
For example, to set phone value for a partner, make a PUT request in the following way:
curl -X PUT -H "Authorization: Basic BASE64_ENCODED_EXPRESSION" \ -H "Content-Type: application/json" -H "Accept: */*" \ -d '{ "phone": "+7123456789"}' "http://example.com/api/v1/demo/res.partner/41"
To set many2one field, you need to pass id as a value:
curl -X PUT -H "Authorization: Basic BASE64_ENCODED_EXPRESSION" \ -H "Content-Type: application/json" -H "Accept: */*" \ -d '{ "parent_id": *RECORD_ID*}' "http://example.com/api/v1/demo/res.partner/41"
For more examples visit https://itpp.dev/sync website
Please log in to comment on this module
Report comment
Any abuse of this reporting system will be penalizedUnable to install in the server
on my local machine works fine. but when i tried to install in the ubuntu server, i got "Unable to install module "openapi" because an external dependency is not met: Python library not installed: bravado_core" tried to install the bravado_core but no luck..
Re: Unable to install in the server
You probably have few python environments on the the server.
Try this command:
python3 -m pip install bravado_core swagger_spec_validator
Time to time unreasonably losts pathes used in integration.
That is first several calls GET: /api/v1/test4/mrp.production works well. Then suddenly same path call returns error 404 NOT FOUND, one-three calls not found error and then works good again.
Meantime Odoo itself fully working like a charm, without any issues or breaks, logs are normal no suspicious lines.
Very strange behaviour, unreliable api.
Re:
Hello Mustafa,
Thank you for your feedback! Can you contact us via e-mail help@itpp.dev with more details about errors you get?
Integrated with Job Queue (OCA)
Can this module be integrated with OCA Job queue for POST & PUT calls..?
Thanks,
Hello!
Unfortunately even after installing bravado core the way you recommended (python3 -m pip install bravado_core swagger_spec_validator) I get the error
Re:
Hello!
Consider to book our support service and help us to maintain this module: https://www.patreon.com/itpp