Thanks for posting the solution in full bandtank , I am currently working on developing an SMS plugin that would allow EspoCRM to send SMS messages using an inexpensive Raspberry - GSM Modem - SIM card combination without having to go through a gateway service and your code example helps a lot.
I will post any progress on this project.
How to pass an array via REST as a parameter
Collapse
X
-
I never figured out how to do this with a GET request, but here is a solution with a POST request.
This is the Python code to submit a request using the requests module:
Code:import requests import base64 baseUrl = "https://espo.domain.com/api/v1/" username = "..." password = "..." token = base64.b64encode(f"{username}:{password}".encode()).decode() def makeRequest(method, endpoint, params, json = None): headers = { "Content-Type": "application/json", "Espo-Authorization": token } if method == "get": r = requests.get (baseUrl + endpoint, headers = headers, params = params) else: r = requests.post(baseUrl + endpoint, headers = headers, params = params, json = json) return r jsonObj = { 'stuff': [1,2,3], 'moreStuff': 'a string' } qParams = { 'foor: 'bar' } makeRequest(method, endpoint = "Invoice/action/ExampleEndpoint, params = qParams, json = jsonObj)
This is the PHP code in custom/Espo/Custom/Controllers/ExampleEntity.php:
PHP Code:<?php namespace Espo\Custom\Controllers; use Espo\Core\Exceptions\BadRequest; class ExampleEntity extends \Espo\Core\Templates\Controllers\Base { public function postActionExampleEndpoint($params, $inpData, $request) { # Store the query parameters, e.g. {url}?foo=bar $foo = $request->get('foor'); # Stores the string 'bar' # If applicable, check to be sure $inpData is an object (a dictionary object in Python) if(gettype($inpData) != "object") throw new BadRequest("Invalid input data: unexpected type"); # Store or use the dictionary/JSON/object data $stuff = $inpData->stuff # Stores the array (1,2,3) $moreStuff = $inpData->moreStuff # Stores the string 'a string' # See parameters and object $GLOBALS['log']->error("params",[$key, $inpData],[]); # Return all input parameters and objects as an associate array (dictionary) to Python return array( 'stuff' => $stuff, 'moreStuff' => $moreStuff, 'foo' => $foo ); } }
Also, there are guides to writing and using API clients in the EspoCRM documentation, which may be helpful:Last edited by bandtank; 02-07-2020, 05:29 PM.Leave a comment:
-
How to pass an array via REST as a parameter
I am trying to pass an array using Python to a custom controller action. I'm not able to get an array out of the request object regardless of what I try. The last array item seems to be accessible, but nothing before it. In the example below, I'm expecting to get the following array in PHP: ['a', 'b', 'c', 'd', 'e']
Here is the python request:
Code:def getJobData(self, jobNumber, exclude, dateStart, dateEnd): params = { "jobNumber": jobNumber, "exclude": ['a', 'b', 'c', 'd', 'e'], "dateStart": dateStart, "dateEnd": dateEnd } endpoint = "Invoice/action/CollectJobData" logging.debug(f"Collectiong job data ({endpoint}, {params})") self.makeRequest(endpoint, params)
Code:Making a request (Invoice/action/CollectJobData, {'jobNumber': '18-0089', 'exclude': ['a', 'b', 'c', 'd', 'e'], 'dateStart': '2000-01-01', 'dateEnd': '2020-02-05'}
This is the code in the controller:
PHP Code:public function getActionCollectJobData($params, $inpData, $request) { $jobNumber = $request->get('jobNumber'); $exclude = $request->get('exclude'); $dateStart = $request->get('dateStart'); $dateEnd = $request->get('dateEnd'); $GLOBALS['log']->error("params",[$jobNumber, $exclude, $dateStart, $dateEnd],[]); }
Code:[2020-02-06 01:10:23] Espo.ERROR: params ["18-0089","e","2000-01-01","2020-02-05"] []
Tags: None
Leave a comment: