JSON (Javascript object notation) is a data-interchange format. It is easy to read and write. It is easy to parse and generate for machines also. RPC is the remote procedure call protocol; JSON-RPC is RPC which is encoded with JSON. It is similar to XML-RPC. The difference is that JSON-RPC does not require a response for sending data to the server.
Odoo web controllers help in creating frontend modules. To know more about Odoo web controllers, Please refer the blog: Web Controllers in Odoo
Mainly we have two types of request parameters in Odoo web controllers, HTTP, and JSON requests.
HTTP Request:
One can define methods to get HTTP requests by passing ‘HTTP’ to the type of the argument of http.route(), then we will get HTTP parameters as the parameters of the method.
@http.route('/lead/case_mark_won', type='http', auth='user', methods=['GET'])
def crm_lead_case_mark_won(self, res_id, token):
comparison, record, redirect = MailController._check_token_and_record_or_redirect('crm.lead', int(res_id), token)
if comparison and record:
try:
record.action_set_won()
except Exception:
_logger.exception("Could not mark crm.lead as won")
return MailController._redirect_to_messaging()
return redirect
JSON Request:
Define methods to get JSON requests by passing JSON to the type of the argument of http.route(). Odoo contacts these methods by using the JSON-RPC protocol. JSON methods must return JSON. They receive arguments as named parameters except if arguments are JSON-RPC parameters.
We need a .js file from which JSON data is sent to python code. For that create a file test.js with the following lines:
var ajax = require('web.ajax');
//To define ajax
var test_variable = document.getElementById("test_variable_id").value;
//To get value from the required field.
ajax.jsonRpc('/url, 'call', {
'test_variable' : test_variable,
});
//json Rpc Call
.then(function (data) {
});
//To receive data from python(non-mandatory)
Here, we pass a value test_value to the corresponding URL of the controller by calling ajax.jsonRpc. After performing operations in the method(from the controller) either one can return the result to the js file or execute from the controller itself.
Next is to add a method in the controller which could handle the Ajax request. This method would return the output data in a JSON format. For that add the following lines to the main.py file of the controller.
@http.route('/request', type='json', auth='user', methods=['POST'], website=True, csrf=False)
def submit(self,):
//perform operations here
return {
'result' : result
}
//if no need to return result then return true
To receive data in the controller from JSON, the type should be JSON in the web controller.