No announcement yet.

How to pass an array via REST as a parameter

  • Filter
  • Time
  • Show
Clear All
new posts

  • 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:

       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)
    which produces this in the Python log:

    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');


    which produces this in the EspoCRM log:

    [2020-02-06 01:10:23] Espo.ERROR: params ["18-0089","e","2000-01-01","2020-02-05"] []
    I don't know if I'm doing something wrong in the code in Python or PHP. How is the EspoCRM API setup to pass array parameters into controllers? I can't find an example anywhere.

  • #2
    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:
    import requests
    import base64
    baseUrl = ""
    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)
        r = + 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:

    namespace Espo\Custom\Controllers;


    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

    # 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.


    • #3
      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.