Frage

In the old v4.x API's it was possible to create or update multiple records in one POST request, but in the new v10 REST API this is no longer documented. Does anyone know how to do it? Or if it's even possible?

I tried a few things, like POSTing the records as a JSON array, but that will only create one empty record.

[{"name":"Case 2"},{"name":"Case 3"}]

Alternatively if there's a use case in SugarCRM where more than one record is created or updated, that's fine as well. I can easily use Fiddler to read how they format the JSON and then use that myself.

War es hilfreich?

Lösung 2

I recently ran into this myself, and also found no documentation on this or any API function available in v10. I personally had a real need for this and found that the best solution would be to create a custom API entry point.

Here is the code that I wrote in order to accomplish multiple entry submission. It does not provide any error handling and was written to be specific to my needs, but this should cover most cases. Once these files are created you must run a quick repair rebuild from the Administration dashboard "Admin >> Repair >> Quick Repair and Rebuild" This is required to register the new entry point.

File: custom/clients/base/api/SetEntriesApi.php

<?php

/*
 * Copyright (C) 2014 DirectPay
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

if (!defined('sugarEntry') || !sugarEntry)
    die('Not A Valid Entry Point');

class SetEntriesApi extends SugarApi {

    public function registerApiRest() {
        return array(
            //POST
            'SetEntries' => array(
                //request type
                'reqType' => 'POST',
                //endpoint path
                'path' => array('record', 'set_entries'),
                //method to call
                'method' => 'setEntriesMethod',
                //short help string to be displayed in the help documentation
                'shortHelp' => 'Provides functionality to create & update multiple records.',
                //long help to be displayed in the help documentation
                'longHelp' => 'custom/clients/base/api/help/SetEntriesApi_help.html',
            ),
        );
    }

    public function setEntriesMethod($api, $args) {
        if (empty($args)) {
            return false;
        }
        $results = array();
        foreach ($args as $module => $records) {
            if (is_array($records)) {
            foreach ($records as $fieldsArray) {
                    $sugarBean = $this->_processEntry($module, $fieldsArray);
                    $results[$module][] = $sugarBean->id;
                }
            }
        }
        return $results;
    }

    private function _processEntry($module, $fieldsArray) {
        if (array_key_exists('id', $fieldsArray)) {
            $sugarBean = BeanFactory::retrieveBean($module, $fieldsArray['id']);
        } else {
            $sugarBean = BeanFactory::newBean($module);
        }
        if (is_null($sugarBean)) {
            return null;
        }
        foreach ($fieldsArray as $field => $data) {
            $sugarBean->$field = $data;
        }
        $sugarBean->save();
        return $sugarBean;
    }

}

?>

File: custom/clients/base/api/help/SetEntriesApi_help.html

<h2>Overview</h2>
<span class="lead">
    This is a custom setEntries endpoint. This is used to create or update 
    multiple modules and records with one call. This was originally available in 
    the older versions of the API, but was removed in v10. This is not a ported
    version from v4.1 and rather a quick recreation of that functionality modified
    slightly to allow for multiple modules.
</span>

<h2>Path Variables</h2>
<span class="lead">
    This endpoint does not accept any path variables.
</span>

<h2>Input Parameters</h2>
<table class="table table-hover">
    <thead>
    <tr>
        <th>Name</th>
        <th>Type</th>
        <th>Description</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>
            args
        </td>
        <td>
            Array
        </td>
        <td>
            Data array to pass to the endpoint.
        </td>
    </tr>
    </tbody>
</table>

<h2>Result</h2>
<table class="table table-hover">
    <thead>
    <tr>
        <th>Name</th>
        <th>Type</th>
        <th>Description</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>
            results
        </td>
        <td>
            Array
        </td>
        <td>
            Array of modules that contain a nested array of the IDs of the updated records and/or newly created record.
        </td>
    </tr>
    </tbody>
</table>

<h3>Output Example</h3>
<pre class="pre-scrollable">
{
  "Accounts": [
    "92e26a99-9e7a-3dca-9ab0-53c6d6833d5f",
    "991b8007-a517-0c8b-6b69-53c6d6fd70fb",
    "9a129144-0f61-e808-00c2-53c6d674bd04",
    "addc4404-ae4a-c031-586b-53c6d60f70dd"
  ]
}
</pre>

<h2>Change Log</h2>
<table class="table table-hover">
    <thead>
    <tr>
        <th>Version</th>
        <th>Change</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>
            v10
        </td>
        <td>
            Added <code>/record/set_entries</code> POST endpoint.
        </td>
    </tr>
    </tbody>
</table>

The custom entry point iterates through the multidimensional array and creates or updates the records individually using the CRUD handling in BeanFactory. In order to update an existing record an id must be passed with the record. Here is an example of the json code that is passed to the endpoint.

JSON code:

{
  "Contacts": {
    "id": "9a129144-0f61-e808-00c2-53c6d674bd04",
    "name": "Contact Name"
  },
  "Accounts": {
    "name": "Account Name"
  }
}

I hope this helps!

Andere Tipps

The v10 API has a "bulk" endpoint that allows you to submit multiple API calls at once.

view {url}/rest/v10/help and scroll down to /bulk for more details

The response of @TO_web really helped me a lot, but the json that is passed to the endpoint must be this way:

{"Contacts":
    [
        {
            "id":"89905d08-5c98-604e-9f49-55d5e670161b",
            "custom_field":"Testing"
        }
    ],
"Accounts":
    [
        {
            "name":"Testing"
        }
    ]
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top